Perché non utilizzare lo XMLHttpRequest()
con il POST?
function beginQuoteFileUnquoteUpload(data)
{
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://www.mysite.com/myuploadhandler.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
alert("File uploaded!");
}
xhr.send("filedata="+encodeURIComponent(data));
}
Lo script del gestore sul server scrive solo i dati del file in un file.
EDIT
upload di file ha ancora un HTTP POST con un diverso tipo di contenuto. È possibile utilizzare questo tipo di contenuto e separare i contenuti con i confini:
function beginQuoteFileUnquoteUpload(data)
{
// Define a boundary, I stole this from IE but you can use any string AFAIK
var boundary = "---------------------------7da24f2e50046";
var xhr = new XMLHttpRequest();
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'
+ data + '\r\n'
+ boundary + '--';
xhr.open("POST", "http://www.mysite.com/myuploadhandler.php", true);
xhr.setRequestHeader(
"Content-type", "multipart/form-data; boundary="+boundary
);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200)
alert("File uploaded!");
}
xhr.send(body);
}
Se si desidera inviare i dati aggiuntivi, basta separare ogni sezione con un confine e descrivere le intestazioni Content-Disposition e tipo di contenuto per ogni sezione . Ogni intestazione è separata da una nuova riga e il corpo viene separato dalle intestazioni da una nuova riga aggiuntiva. Ovviamente, caricare i dati binari in questo modo sarebbe leggermente più difficile :-)
Ulteriori modifiche: dimenticato di menzionare, assicurati che qualsiasi stringa di limite non sia nel "file" di testo che stai inviando, altrimenti lo farà essere trattati come un limite.
fonte
2010-02-04 09:29:23
Dubito che sia possibile, ma interessante domanda, +1 –
Questa sembra la soluzione sbagliata al vostro problema (se hai il controllo del lato server). Se il contenuto del file verrà generato da una stringa, perché non solo POST quella stringa e creare il file sul server (utilizzando PHP o qualsiasi altra cosa)? Se si sta caricando un file su una destinazione di terze parti, ignorare questo commento. –
@JonathanJulian, non importa cosa, questo usecase odora di valore di hack reale -), fantastico trucco! – nemesisfixx