Почему бы просто не использовать XMLHttpRequest()
с 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));
}
Сценарий обработчика на сервере просто записывает данные файла в файл.
EDIT
Загрузка файла - это все еще пост http с другим типом контента. Вы можете использовать этот тип контента и отделить его от границ:
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);
}
Если вы хотите отправить дополнительные данные, вы просто разделяете каждый раздел границей и описываете расположение содержимого и заголовки типа содержимого для каждого раздела. Каждый заголовок отделяется новой строкой, а тело отделяется от заголовков дополнительной новой строкой. Естественно, загрузка двоичных данных таким способом будет немного сложнее: -)
Дальнейшее редактирование: забыли упомянуть, убедитесь, что какая-либо строка границы отсутствует в текстовом «файле», который вы отправляете, иначе она будет рассматриваться как граница.