通过签名 url 将图像上传到 AWS-S3 时图像损坏

Nir*_*ner 6 upload amazon-s3 node.js pre-signed-url

我正在尝试通过来自 NodeJS 服务器(而不是来自浏览器)的签名 url 将图像上传到 aws-s3。要上传的图像已由 NodeJS 生成。我从 aws 获取签名的 url 并成功将其上传到 s3。

但是我的形象被破坏了。出于某种原因,S3 正在向我的图像添加一些标题(比较附加的图像)。

我究竟做错了什么?

获取签名网址:

    try {
        var params = {
            Bucket: bucketName,
            Key: 'FILE_NAME.png',
            Expires: 60
        };
        const url = await s3.getSignedUrlPromise('putObject', params);
        return url;
    } catch (err) {
        throw err;
    }
Run Code Online (Sandbox Code Playgroud)

上传到 s3

        var stats = fs.statSync(filePath);
        var fileSizeInBytes = stats["size"];
        const imageBuffer = fs.readFileSync(filePath);

        var formData = {
            'file': {
                value: imageBuffer,
                options: {
                    filename: 'FILE_NAME.png'
                }
            }
        };

        request({ 
            method: 'put',
            url, 
            headers: {
                'Content-Length': fileSizeInBytes,
                'Content-MD': md5(imageBuffer)           
            }, 
            formData 
        }, function (err, res, body) {
             console.log('body',body);
        });
Run Code Online (Sandbox Code Playgroud)

比较实际图像和上传到 s3 的图像。S3 添加了一些标题:

相比

Sam*_*roe 11

我知道这很旧,但我在同一个问题上挣扎了一段时间。使用预先定义的 url 上传时,请勿使用 new FormData();

我注意到一件事,我在 s3 上的所有文件都比原始文件大 2kb。

<input type="file" id="upload"/>

var upload = document.getElementById('upload');
var file = upload.files[0];

//COMMENTED OUT BECAUSE IT WAS CAUSING THE ISSUE
//const formData = new FormData();
//formData.append("file", file);

// Assuming axios

const config = {
    onUploadProgress: function(progressEvent) {
        var percentCompleted = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
        );
        console.log(percentCompleted);
    },
    header: {
        'Content-Type': file.type
    }
};

axios.put(S3SignedPutURL, file, config)
   .then(async res => {
        callback({res, key})
    })
    .catch(err => {
        console.log(err);
    })
Run Code Online (Sandbox Code Playgroud)

  • 爱你,伙计:D,我不知道为什么有很多教程和 SO 帖子,而且所有这些都使用 new FormData(),谢谢! (2认同)
  • 我可以吻你!互联网的其余部分告诉我使用 FormData ! (2认同)

Hut*_*yad 6

2023年来到这里,使用formdata面临同样的问题,但是在postman中,然后将其交给前端部门。

要在邮递员中处理它,请使用请求正文的类型binary在此输入图像描述

并且不要忘记添加正确的标题。


sza*_*oat -1

尝试将请求中的内容类型指定为Content-Type multipart/form-data