2016-06-15 2 views
0

Мне нужно отправить данные POST на сервер с nw.js. Данные объединяют простые пары имя-значение и один файл, т. Е. Тип запроса - multipart/form-data. Все данные должны отправляться по одному запросу.Запрос на многостраничный/форма-данные от nw.js

Я использую XMLHttpRequest и FormData для отправки моих данных. Код:

function toArrayBuffer(buffer) {  // convert Node's Buffer to ArrayBuffer 
    var ab = new ArrayBuffer(buffer.length); 
    var view = new Uint8Array(ab); 
    for (var i = 0; i < buffer.length; ++i) { 
     view[i] = buffer[i]; 
    } 
    return ab; 
} 

var fData = new global.window.FormData(); 
fData.append('email', email); 
fData.append('foo', 'bar');  // some plain data; 
var fs = require('fs'); 
var buff; 

fs.readFile(data.path, function (err, data) { // data.path contents full path to the file 
    if(err) { 
     console.log('file reading error'); 
     // handling a errors 
    }else{ 
     console.log('reading complete'); 
     buff = data;      // buffer contains data, checked 
     send(); 
    }; 
}); 

function send() { 
    var blob = new global.window.Blob([toArrayBuffer(buff)], { type:'image/jpeg' }); // here is a problem, I think 
    fData.append('file', blob); 
    // I've tried some cases: 
    // var blob = new Blob(toArrayBuffer(buff), { type:'image/jpeg' }); //without array braces it throws a error: The 1st argument provided is either null, or an invalid Array object. 
    // var blob = new Blob(buff, { type:'image/jpeg' }); // directly, same error 

    var xhr = new global.window.XMLHttpRequest(); 
    xhr.open("POST", url); 
    xhr.timeout = 30000; 
    xhr.onload = xhr.onerror = function() { 
     // handling result or errors... 
    }; 
    xhr.send(fData); 
} 

XMLHttpRequest отправляет все данные, кроме файла. Вот запрос полезной нагрузки:

------WebKitFormBoundaryc0ClIBTxPlqPmilD 
Content-Disposition: form-data; name="email" 

email 
------WebKitFormBoundaryc0ClIBTxPlqPmilD 
Content-Disposition: form-data; name="message_id" 

4b38ad18-0501-9c0d-9cf6-e0a2fcca1898 
------WebKitFormBoundaryc0ClIBTxPlqPmilD 
Content-Disposition: form-data; name="foo" 

bar 
------WebKitFormBoundaryc0ClIBTxPlqPmilD 
Content-Disposition: form-data; name="file"; filename="blob" 
Content-Type: image/jpeg 


------WebKitFormBoundaryc0ClIBTxPlqPmilD-- 

Раздел файла пуст.

Я также попытался передать буфер непосредственно в FormData. В этом случае файл отправляет, но сервер не распознает файл как файл - вместо этого он помещает файл в строку (обычный сервер PHP).

Благодаря

+0

Привет Дмитрий, вы ее решаете? – bedna

+0

@bedna yes, написал ответ ниже – Dmitry

ответ

1

я решить ее с form-data библиотеки:

var FormData = require('form-data'); 
var form = new FormData(); 
var fs = require('fs'); 
form.append('email', email); 
form.append('foo', 'bar'); 
form.append('logo', fs.createReadStream(fileOnDisk)); // attach file 
form.submit(url, function(err, res) { ... } 
+0

Спасибо .. Отлично. – bedna

Смежные вопросы