2

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: {}
4

1 に答える 1

0

多くの変更の後、ついに方法を見つけました!これは私のリーダーコードです:

reader.readAsArrayBuffer(file);

ファイルの種類を から に変更しbufferましたがBlob、動作します。

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 File タグは Blob for HTML Forms を使って投稿していると思います。

于 2013-07-03T18:23:05.590 に答える