简体   繁体   English

将JS FileReader与FormData一起使用

[英]Using JS FileReader with FormData

I'm trying to upload files to S3. 我正在尝试将文件上传到S3。 My UI supports drag-drop and a file input element, so my plan is to start with the blobs returned by drop and by input events, use FileReader to load their contents, and then process using FormData. 我的UI支持拖放文件输入元素,因此我的计划是从drop和输入事件返回的blob开始,使用FileReader加载其内容,然后使用FormData处理。

The issue is at ***** . 问题在***** It looks as though .result is an arraybuffer of some nonzero size, but what I find on S3 is just a 20b file called ${filename} with contents [object ArrayBuffer] . 看起来好像.result是一些非零大小的arraybuffer,但我找到S3只是一个20B文件调用${filename}与内容[object ArrayBuffer]

What am I missing in this flow 我在此流程中缺少什么

function sendSigned(fileObj, cb) {
    console.log("send signed", fileObj)
    let formData = new FormData();
    const host = "http://localhost:4000"

    formData.append("key", fileObj.signature.stem + "${filename}");
    formData.append("x-amz-algorithm", "AWS4-HMAC-SHA256");
    formData.append("x-amz-credential", fileObj.signature.credential);
    formData.append("x-amz-date", fileObj.signature.date);
    formData.append("success_action_redirect", host + "/upload/success");
    formData.append("policy", fileObj.signature.policy);
    formData.append("x-amz-signature", fileObj.signature.signature);

    let fileReader = new FileReader();
    fileReader.onload = function(evt) {
        console.log(evt);
        // ******************************************
        // formData.append("file", evt.target.result);
        formData.append("file", fileReader.result);

        jQuery.ajax({
            url: 'http:\/\/uploads.s3.amazonaws.com',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            type: 'POST',
            success: (res) => {
                console.log(res);
                let s3Conf = Object.assign(fileObj, {
                    confirmation: res.ETag,
                    zipname : fileObj.signature.stem + fileObj.nativeFiles[0].name,
                    status: "Done"
                });
                cb(s3Conf);
            },
            error: (err) => {
                console.error(err);
                let s3Conf = Object.assign(fileObj, {
                    error: err,
                    status: "Done"
                });
                cb(s3Conf);
            }
        });
    }
    fileReader.readAsArrayBuffer(fileObj.nativeFiles[0].blob);
}

You cannot send an array buffer with a FormData object(you can however send it as the entire post body). 您不能使用FormData对象发送数组缓冲区(但是可以将其作为整个post正文发送)。 FormData accepts blobs so you can just pass it that. FormData接受blob,因此您可以通过它。

function sendSigned(fileObj, cb) {
    console.log("send signed", fileObj)
    let formData = new FormData();
    const host = "http://localhost:4000"

    formData.append("key", fileObj.signature.stem + "${filename}");
    formData.append("x-amz-algorithm", "AWS4-HMAC-SHA256");
    formData.append("x-amz-credential", fileObj.signature.credential);
    formData.append("x-amz-date", fileObj.signature.date);
    formData.append("success_action_redirect", host + "/upload/success");
    formData.append("policy", fileObj.signature.policy);
    formData.append("x-amz-signature", fileObj.signature.signature);
    formData.append("file", fileObj.nativeFiles[0].blob, fileObj.nativeFiles[0].name);

    jQuery.ajax({
        url: 'http:\/\/uploads.s3.amazonaws.com',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        type: 'POST',
        success: (res) => {
            console.log(res);
            let s3Conf = Object.assign(fileObj, {
                confirmation: res.ETag,
                zipname : fileObj.signature.stem + fileObj.nativeFiles[0].name,
                status: "Done"
            });
            cb(s3Conf);
        },
        error: (err) => {
            console.error(err);
            let s3Conf = Object.assign(fileObj, {
                error: err,
                status: "Done"
            });
            cb(s3Conf);
        }
    });

}

Note your server side logic will need to read the field name as a file field. 请注意,您的服务器端逻辑将需要读取字段名称作为文件字段。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM