2010-06-10 8 views
9

Utilizzando javascript, ho un file in stringa (ottenuto con una richiesta Ajax).Come caricare una stringa come file con jQuery o altro framework js

Come caricarlo come file sul server da un'altra richiesta Ajax?

+1

Si prega di chiarire: avete il percorso del file come una stringa o avete il contenuto del file come stringa e ti piacerebbe averlo caricato come un file? –

+0

@Marko: Si legge come se avesse il contenuto del file in una stringa, ottenuto da una richiesta Ajax. –

risposta

13

è necessario impostare l'intestazione Content-type richiesta di multipart/form-data e giocare con il formato un po ', I wrote this in Plain Ol' JavaScript (tm), ma si potrebbe facilmente rielaborarlo per una libreria:

EDIT: avevo il mio caffè adesso, cosí modificato per jQuery (no-library versione here):

// Define a boundary, I stole this from IE but you can use any string AFAIK 
var boundary = "---------------------------7da24f2e50046"; 
var body = '--' + boundary + '\r\n' 
     // Parameter name is "file" and local filename is "temp.txt" 
     + 'Content-Disposition: form-data; name="file";' 
     + 'filename="temp.txt"\r\n' 
     // Add the file's mime-type 
     + 'Content-type: plain/text\r\n\r\n' 
     // Add your data: 
     + data + '\r\n' 
     + '--'+ boundary + '--'; 

$.ajax({ 
    contentType: "multipart/form-data; boundary="+boundary, 
    data: body, 
    type: "POST", 
    url: "http://asite.com/apage.php", 
    success: function (data, status) { 
    } 
}); 
+1

Mmm, bello! Non sapevo che era possibile in una richiesta Ajax. –

+0

@Pekka: certo. Pratico se non hai il controllo sul server che stai caricando e deve accettare un file di testo pubblicato con multipart/form-data. –

+4

Questo ha funzionato, tranne che per due aggiustamenti per lavorare con express/node: 1) l'ultimo limite deve essere "+" - "+ boundary +" - ";" e anche il contentType nella chiamata ajax deve essere: "multipart/form-data; boundary =" + boundary' – chovy

7

Ecco come farlo senza costruire manualmente la richiesta più parti del corpo:

var s = 'some string data'; 
var filename = 'foobar.txt'; 

var formData = new FormData(); 
formData.append('file', new File([new Blob([s])], filename)); 
formData.append('another-form-field', 'some value'); 

$.ajax({ 
    url: '/upload', 
    data: formData, 
    processData: false, 
    contentType: false, 
    type: 'POST', 
    success: function() { 
     console.log('ok'); 
    }, 
    error: function() { 
     console.log('err'); // replace with proper error handling 
    } 
}); 
+0

sembra carino ... posso transcodificare Base64 in un oggetto File? Se no posso usare il Base64 e decodificarlo sul server. ma sono solo curioso – redestructa

+0

L'oggetto FormData è compatibile con il cross browser? –

Problemi correlati