2009-05-28 6 views
16

Per essere più specifici, voglio usare un modulo con uno o più campi di input file usati per le immagini. Quando quei campi sono cambiati, mi piacerebbe mostrare un'anteprima dell'immagine associata, prima di inviare i dati al server.è possibile visualizzare l'anteprima delle immagini locali prima di caricarle tramite un modulo?

Ho provato un numero di approcci javascript, ma mi imbatto sempre in errori di sicurezza. Non mi dispiacerebbe usare java o flash, a patto che la soluzione si degradasse con garbo per quegli utenti che non li avevano. (Non otterrebbero anteprime e non otterrebbero neanche una fastidiosa "installazione di questa cosa")

Qualcuno ha fatto questo in un modo semplice e riutilizzabile?

P.S. So che c'è una sandbox, ma la sandbox deve essere in una stanza buia e chiusa a chiave con tutte le finestre oscurate?

+0

Non si può visualizzare in anteprima l'immagine senza caricarlo prima. Non lo so, si può fare con Flash, probabilmente con Java, ma penso che sarebbe come provare a uccidere una mosca con un martello. Puoi fare un caricamento "Ajax simulato" con iframe, ci sono alcuni esempi sulla rete e funzionano abbastanza bene. –

+0

possibile duplicato di [C'è un modo per consentire a un utente di visualizzare un'immagine che sta per caricare il lato client prima di caricarlo sul server?] (Http://stackoverflow.com/questions/3515965/is-there-a-way -tutto-un-utente-visualizzare-un-immagine-sono-about-to-upload-client-side-b) –

+0

Dai un'occhiata a questo puro approccio di JavaScript, inclusa la sua risposta e il commento di Ray Nicholus per il soluzione finale: http://stackoverflow.com/questions/16430016/using-readasdataurl-for-image-preview –

risposta

-1

JavaScript non ha accesso al file system locale per motivi di sicurezza, periodo.

+0

È un'idiozia di sicurezza. Tale file non può essere inviato al server, quindi a cosa serve? Ho visto molti giochi web che hanno la possibilità di scaricare elementi grafici sul tuo hdd, quindi il gioco funziona più velocemente. – Thinker

+0

Pensatore, che in genere viene eseguito con il caching HTTP: è una cosa completamente diversa. JS continua a non avere accesso ai percorsi sul filesystem del client. –

+1

Tranne che ora c'è un'API di file HTML5 che ti dà accesso in lettura ai file che vengono caricati. E 'sicuro –

1

Il primo passo è individuare il percorso dell'immagine. JavaScript è autorizzato a interrogare il controllo di upload per un nome file/percorso, ma (per ragioni di sicurezza) vari browser mostrano cose diverse al motore JS di quanto non visualizzino all'utente - tendono a mantenere intatto il nome del file in modo da poter almeno convalidare la sua estensione, ma potresti ottenere c:\fake_path\ o qualcosa simile offuscato anteposto al nome del file. Provare questo su vari browser ti darà un'idea di ciò che viene restituito come un vero percorso, e cosa viene simulato e dove.

Il secondo passaggio è la visualizzazione dell'immagine. È possibile visualizzare le immagini locali se si conoscono i loro percorsi, tramite i tag img con gli URL di origine file://, se il browser dell'utente consente lo schema file://. (Firefox non lo fa, per impostazione predefinita.) Quindi se riesci a indurre l'utente a dirti quale sia il percorso completo dell'immagine, puoi almeno provare a caricarlo.

+0

testati +1 e funziona MSIE6,7 – zeroin23

0

Ho sempre visto solo applet Java che eseguono questa operazione, ad esempio l'applet di caricamento delle immagini su Facebook. L'aspetto negativo dell'approccio Java è che all'utente verrà richiesto di affidarsi all'applet prima dell'esecuzione, che è una sorta di fastidio, ma ciò consente all'applet di presentare un browser di file con anteprime di immagini o fare cose più interessanti come l'utente per caricare un'intera directory.

25

Non c'è bisogno di cose fantasiose. Tutto ciò che serve è la funzione createObjectURL, che crea un URL che può essere utilizzato come immagine src e può provenire direttamente da un file locale.

Supponiamo di aver selezionato un paio di immagini dal computer dell'utente utilizzando un elemento di input file (<input type="file" />). Ecco come si creerebbe le anteprime per i file di immagine per esso:

function createObjectURL(object) { 
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object); 
} 

function revokeObjectURL(url) { 
    return (window.URL) ? window.URL.revokeObjectURL(url) : window.webkitURL.revokeObjectURL(url); 
} 

function myUploadOnChangeFunction() { 
    if(this.files.length) { 
     for(var i in this.files) { 
      var src = createObjectURL(this.files[i]); 
      var image = new Image(); 
      image.src = src; 
      // Do whatever you want with your image, it's just like any other image 
      // but it displays directly from the user machine, not the server! 
     } 
    } 
} 
+0

Funziona, ma solo in Chrome 18, Chromium 18, Firefox 11. Non funziona in Safari, IE 9 e non ho fatto il check in. http://jsfiddle.net/M3kj6/1/ Ci lavorerò più tardi per vedere se riesco a farlo funzionare in sicurezza e cioè. Comunque è interessante ... :) –

+1

Questo è il modo più appropriato per questo compito. In base a questo: https://developer.mozilla.org/en-US/docs/DOM/window.URL.createObjectURL funziona già in IE 10 e Opera. –

+0

Ottima risposta, grazie. – whitelionV

0

Si può provare questo approccio, anche se sembra che non funziona su IE.

http://saravani.wordpress.com/2012/03/14/preview-of-an-image-before-it-is-uploaded/

E 'semplice e veloce per il codice.

ho messo il codice qui solo nel caso in cui la fonte muore:

Script:

<!-- Assume jQuery is loaded --> 
    <script> 
     function readURL(input) { 
     if (input.files && input.files[0]) { 
      var reader = new FileReader(); 

      reader.onload = function (e) { 
      $('#img_prev') 
       .attr('src', e.target.result) 
       .width(150) 
       .height(200); 
      }; 

      reader.readAsDataURL(input.files[0]); 
     } 
     } 
    </script> 

Nella HTML:

<!--[if IE]> 
     <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 
    </head> 
    <body> 
     <input type='file' onchange="readURL(this);" /> 
     <img id="img_prev" src="#" alt="your image" /> 
    </body> 
Problemi correlati