AJAX没有将图像上传到后端服务

时间:2018-03-22 05:02:15

标签: javascript node.js ajax amazon-s3 multipartform-data

处理将图像上传到AWS实例的要求。 UI和服务是分开的,并通过REST连接。服务在nodejs中。从UI我们正在对后端服务进行ajax调用,以将图像上传到AWS。

问题: 当我通过POSTMAN请求上传图像时,我可以看到上传的响应与在AWS中正确上传的文件一起上传。 而当我通过AJAX调用上传图像时,我在浏览器中没有响应,并且图像也没有上传到aws中。

以下是ajax中的代码:

var formData = new FormData();
    formData.append('image', $('#tx_file_programa')[0]);

    $.ajax({
        method: 'POST',
        type: "POST",
        url: 'http://10.0.0.95:9999/photo/1',
        contentType: false,
        processData: false,
        async: false,
        cache: false,
        beforeSend: function (xhr) {
            xhr.setRequestHeader('Authorization', 'Bearer ' + access_token );
        },
        data: formData,
        success: function (data) {
            console.log('response from server is : ', data);
        }
        //dataType: 'json'
    });

这是后端服务。

server.post('/photo/:count', function (req, res) {
        if (req.getContentType() == 'multipart/form-data') {
            var form = new formidable.IncomingForm(),
                files = [], fields = [];
            var result = [];
            var noOfFiles = req.params.count;
            var count = 0;
            console.log('noOfFiles', noOfFiles);


            form.on('field', function(field, value) {
                fields.push([field, value]);
                console.log(fields);
            })

            form.on('progress', function(bytesReceived, bytesExpected) {
                console.log('err');
            });

            form.on('error', function(err) {
                console.log('err',err);
            });

            form.on('aborted', function() {
                console.log('aborted', arguments);
            });

            new Promise(function(resolve, reject) {
                var result = [];
                form.onPart = function (part) {
                    var data = null;
                    const params = {
                        Bucket: 'xxxxx',
                        Key: uuidv4() + part.filename,
                        ACL: 'public-read'
                    };

                    var upload = s3Stream.upload(params);

                    upload.on('error', function (error) {
                        console.log('errr', error);
                    });
                    upload.on('part', function (details) {
                        console.log('part', details);
                    });
                    upload.on('uploaded', function (details) {
                        let extension = details.Location.split('.');
                        if(['JPG', 'PNG'].indexOf(extension[extension.length - 1].toUpperCase()) > -1) {
                            var ext = extension[extension.length - 1];
                            count++;
                            result.push(details.Location);
                            if(count == noOfFiles) {
                                resolve(result);
                            }
                        }
                    });
                    part.pipe(upload);
                }
            }).then(function(result){
                console.log('end', result);
                res.writeHead(200, {'content-type': 'text/plain'});
                res.end('received files:\n\n ' + util.inspect(result));
            })
            form.parse(req, function (err, fields, files) {
            })
            return;
        } else {
            BadRequestResponse(res, "Invalid request type!");
        }
    })

2 个答案:

答案 0 :(得分:1)

@ user3336194,你能用这个来检查,这是不可行的

var appIconFormData = null

$(":file").change(function () {
    var file = this.files[0], name = file.name, size = file.size, type = file.type;
    var imageType = new Array("image/png", "image/jpeg", "image/gif", "image/bmp");
    if (jQuery.inArray(type, imageType) == -1) {
        return false;
    } else {
        appIconFormData = new FormData();
        appIconFormData.append('appimage', $('input[type=file]')[0].files[0]);
    }
});

$.ajax({
    url: 'your/api/destination/url',
    type: 'POST',
    data: appIconFormData,
    cache: false,
    contentType: false,
    processData: false,
    success: function (data) {
        console.log(data)
    },
    error: function (e) {
    }
});

答案 1 :(得分:0)

我认为你发送formdata的方式不正确。

尝试以下两种方式:

您可以将整个表单提供给FormData()进行处理

var form = $('form')[0]; // You need to use standard javascript object here
var formData = new FormData(form);

或指定FormData()

的确切数据
var formData = new FormData();
// Attach file
formData.append('image', $('input[type=file]')[0].files[0]);