Почему бы не просто использовать 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 POST с различным типом контента. Вы можете использовать этот тип контента и отделить содержание с границами:
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);
}
Если вы хотите отправить дополнительные данные, вы просто разделить каждую секцию с границей и описать содержание-расположение и типа содержимого заголовков для каждой секции , Каждый заголовок разделяется новой строкой, и тело отделено от заголовков дополнительной новой строкой. Естественно, загрузка двоичных данных таким образом будет несколько сложнее :-)
Дальнейшее редактирование: забыли упомянуть, убедитесь, что какая-либо граничная строка отсутствует в текстовом «файле», который вы отправляете, иначе это будет рассматриваться как граница.
Я сомневаюсь, что это возможно, но интересный вопрос, +1 –
Это кажется неправильным решение вашей проблемы (если у вас есть контроль над серверной стороной). Если содержимое файла будет сгенерировано из строки, почему бы не просто выполнить POST эту строку и создать файл на сервере (используя PHP или что-то еще)? Если вы загружаете файл третьему лицу, то игнорируйте этот комментарий. –
@JonathanJulian, несмотря ни на что, этот usecase пахнет реальной взломанной стоимостью -), потрясающий трюк! – nemesisfixx