npm Formidable Upload,在客户端上使用JS FormData

时间:2013-07-02 13:37:24

标签: javascript node.js multipartform-data formidable

我想通过拖放将文件发送到带有FormData的服务器,并将其保存到节点中Formidable的磁盘上。

我使用此代码发送文件:https://github.com/felixge/node-formidable#example

并且它可以工作,我的服务器保存数据,但我不能通过js FormData发送它。我编写了这段代码,但它没有将收到的数据解析为文件,并将它们显示为字段。代码描述得更好:

// Client code
//inside drop event so i have files:

files = event.dataTransfer.files;
file = files[0];

reader = new FileReader();

reader.readAsArrayBuffer(file);

reader.onload = function(evt) {
    var data, fd;
    data = evt.target.result; // it's real binary data on log
    fd = new FormData;
    fd.append("foo", "bar");
    fd.append("upload", data);
    uploadImage(fd);
}

uploadImage = function(data) {
    xmlHttp.overrideMimeType("multipart/form-data");
    xmlHttp.open('post', '/upload');
    xmlHttp.send(data);
}

它工作并将数据发送到服务器,但formidable的解析方法记录如下:

fields: {foo: 'bar', upload=''}
files: {}

1 个答案:

答案 0 :(得分:0)

经过很多改变,终于找到了办法! 这是我的读者代码:

reader.readAsArrayBuffer(file);

我更改了文件类型,从bufferBlob,它可以正常工作:

arrayBufferToBlob: function(buffer, opt_contentType) {
    var uInt8Array;
    uInt8Array = new Uint8Array(buffer);
    return new Blob([uInt8Array], (opt_contentType ? {
        type: opt_contentType
    } : {}));
}

更改客户端代码:

//Changes of Client:
fd = new FormData;
data = arrayBufferToBlob(data);
fd.append("upload", data, "FileName");

nodeJS服务器的日志如下:

fields: {foo: 'bar'}
files: {'fileName'}

我认为Chrome(未在其他浏览器上试过)HTML文件代码使用Blob for HTML Forms发布...如果你有想法,请告诉我们!