2011-09-23 3 views
5

La mia funzione javascript carica solo file di testo correttamente. Qualcuno può aiutarmi a capire come farlo accettare anche le immagini, ecc.?JavaScript non sta caricando dati binari

function fileUpload(files) { 
    if (!files.length) { 
    fileList.innerHTML = "<p>No files selected!</p>"; 
    } else {  
var list = document.createElement("ul"); 

for (var i = 0; i < files.length; i++) { 

    //Set vars 
    var file = files[i], 
    fileName = file.name, 
    fileSize = file.size, 
    fileData = file.getAsBinary(), 
    boundary = "xxxxxxxxx", 
    uri = "receive.php", 

    //Create file info HTML output 
    li = document.createElement("li"); 
    list.appendChild(li); 
    var info = document.createElement("span"); 
    info.innerHTML = file.name + ": " + file.size + " bytes"; 
    li.appendChild(info); 

    //Start sending file 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", uri, true); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); // simulate a file MIME POST request. 

    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     if ((xhr.status >= 200 && xhr.status <= 200) || xhr.status == 304) { 

     if (xhr.responseText != "") { 
      alert(xhr.responseText); // display response. 
     } 
     } 
    } 
    } 

    var body = "--" + boundary + "\r\n"; 
    body += "Content-Disposition: form-data; name='upload'; filename='" + fileName + "'\r\n"; 
    body += "Content-Type: application/octet-stream\r\n\r\n"; 
    body += fileData + "\r\n"; 
    body += "--" + boundary + "--"; 

    xhr.send(body); 

} 
fileList.appendChild(list); 
return true; 
    } 
} 

Aggiornamento: Ho trovato la seguente funzione on-line su http://code.google.com/p/html5uploader/ ma non riesco a capire come applicarlo alla mia attuale funzione. Xhr.sendAsBinary è l'unica cosa che è cambiata?

// Upload image files 
upload = function(file) { 

    // Firefox 3.6, Chrome 6, WebKit 
    if(window.FileReader) { 

     // Once the process of reading file 
     this.loadEnd = function() { 
      bin = reader.result;     
      xhr = new XMLHttpRequest(); 
      xhr.open('POST', targetPHP+'?up=true', true); 
      var boundary = 'xxxxxxxxx'; 
      var body = '--' + boundary + "\r\n"; 
      body += "Content-Disposition: form-data; name='upload'; filename='" + file.name + "'\r\n"; 
      body += "Content-Type: application/octet-stream\r\n\r\n"; 
      body += bin + "\r\n"; 
      body += '--' + boundary + '--';  
      xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary); 
      // Firefox 3.6 provides a feature sendAsBinary() 
      if(xhr.sendAsBinary != null) { 
       xhr.sendAsBinary(body); 
*snip* 
+0

Come recuperare i file. Voglio dire che il parametro del file deve essere fornito da qualche parte. Come si fa a farlo? Ho bisogno di un po 'di spiegazione su questo argomento del caricamento di file tramite ajax. Qualsiasi aiuto sarà molto apprezzato. – user1575229

+0

@ user1698985 Non sono sicuro di cosa intendi, vuoi dire recuperarlo dal lato PHP? In tal caso lo puoi trovare nei dati POST. – natli

+0

recuperarlo sul lato server è un'altra discussione. Voglio solo trovare il modo in cui il file viene selezionato sul client caricato nei dati dei moduli e inviato tramite Ajax. In Html5 è facile. ma non capisco come sia nelle versioni precedenti di html. Ho provato a dare un'occhiata al plug-in ajaxform, ma è difficile capirlo da come sta recuperando i dati dei file e inviando tramite ajax. Voglio capire l'intera procedura, dalla selezione del file alla gestione in jQuery e all'invio al server. – user1575229

risposta

2

C'è un esempio W3C di invio di un'immagine GIF usando multipart/form-data a http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2:

 
Content-Type: multipart/form-data; boundary=AaB03x 

--AaB03x 
Content-Disposition: form-data; name="submit-name" 

Larry 
--AaB03x 
Content-Disposition: form-data; name="files" 
Content-Type: multipart/mixed; boundary=BbC04y 

--BbC04y 
Content-Disposition: file; filename="file1.txt" 
Content-Type: text/plain 

... contents of file1.txt ... 
--BbC04y 
Content-Disposition: file; filename="file2.gif" 
Content-Type: image/gif 
Content-Transfer-Encoding: binary 

...contents of file2.gif... 
--BbC04y-- 
--AaB03x-- 

Avviso la linea supplementare Content-Transfer-Encoding: binary. Prova ad aggiungerlo.

EDIT: Prova Base64 codifica dei dati di file utilizzando the Base64 jQuery plugin:

var body = "--" + boundary + "\r\n"; 
    body += "Content-Disposition: form-data; name='upload'; filename='" + fileName + "'\r\n"; 
    body += "Content-Type: application/octet-stream\r\n"; 
    body += "Content-Transfer-Encoding: base64\r\n\r\n"; 
    body += $.base64Encode(fileData) + "\r\n"; 
    body += "--" + boundary + "--"; 
+0

Sfortunatamente questo non ha cambiato nulla. I file di testo vengono ancora caricati correttamente ma le immagini non lo sono. Le immagini finiscono sul server danneggiato e sono circa il doppio della loro normale dimensione di file. Ho comunque trovato una funzione online che fa quello che voglio, ma siccome sono nuovo in javascript non so come implementarlo nella mia funzione. (Vedi domanda aggiornata) A causa della mia inesperienza, anch'io non capisco la tua domanda, perché dovrebbe essere body.length? – natli

+0

@natli: [Dato che Firefox è apparentemente l'unico browser che supporta 'sendAsBinary()' natively] (http://stackoverflow.com/q/4236153/196844), sembra che utilizzino 'sendAsBinary() incorporato in FF 'metodo, ma su Chrome e Safari, implementano un work-around (solo una supposizione, però). In ogni caso, forse il binario dovrebbe essere prima codificato con base64. Quindi imposta 'Content-Transfer-Encoding: base64'. Per quanto riguarda 'Content-Length', questa è una delle intestazioni che non può essere impostata con il metodo' setRequestHeader() '(http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method). Quindi, non ti preoccupare. –

+0

@natli: ho aggiornato la mia risposta. –