Domanda

Nel nostro progetto attuale stiamo fornendo un download PDF che può essere personalizzato dall'utente tramite un modulo HTML da lui inviato. Ci vogliono diversi secondi per generare dinamicamente il PDF e mi piacerebbe visualizzarlo, ad es. disabilitando il pulsante di invio fino all'avvio del download. Sfortunatamente, non sono riuscito a trovare un modo per rilevare quando inizia il download *. Quindi non saprei quando riattivare il pulsante di invio.

Ho già provato a specificare un IFrame come destinazione del mio modulo HTML, sperando che l'evento onload venga attivato. Non è, tuttavia, probabilmente perché il PDF viene inviato con un " Content-disposition: allegato " intestazione e in realtà non viene caricato nell'IFrame.

L'unica soluzione che mi viene in mente in questo momento consiste nel generare il PDF in un file temporaneo sul server, che vorrei evitare.

*) Vorrei chiarire questo: non avrei bisogno di sapere se il download è stato completato o anche se è stato avviato davvero. Vorrei rilevare il punto in cui il browser chiederà all'utente se aprire o salvare il file. Immagino che ciò accada quando il browser riceve l'intestazione HTTP.

È stato utile?

Soluzione

Quello che vuoi è essere in grado di rilevare quando la dimensione del file scaricato passa da 0 a un valore positivo. Per quanto ne so, è impossibile farlo con javascript: è necessario un plug-in che possa accedere al file system del client.

Soluzione consigliata: creare una sessione per download. Chiedi al client di interrogare il server sullo stato del download. Questo potrebbe essere "inesistente", "non avviato", "iniziato", "finito". È necessario un po 'di lavoro sul lato server per persistere e aggiornare lo stato del download più un framework AJAX.

Altri suggerimenti

Se fossi in te, farei una chiamata AJAX al server con le informazioni, generare il file, quindi restituire il nome file / id / qualunque cosa al javascript, che quindi rende window.location qualcosa come download.php? id = x (ma il file è già stato generato, quindi sta semplicemente impostando le intestazioni e leggendolo) a quel punto puoi riattivare l'invio.

La soluzione più semplice sarebbe quella di stimare il tempo (generosamente) e farlo in questo modo. È un trucco, ma dà l'effetto desiderato. L'altra opzione potrebbe essere quella di inviare il modulo con una richiamata utilizzando Ajax per inviare il modulo e fare in modo che il generatore restituisca i dettagli alla pagina chiamante. http://www.jquery.com/ potrebbe essere un buon punto di partenza per questa opzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top