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

pdsfdshx  于 12个月前  发布在  Node.js
关注(0)|答案(4)|浏览(136)

我试图通过NodeJS服务器(而不是浏览器)的签名URL将图像上传到aws-s3。要上传的图像已由NodeJS生成。我从aws得到签名网址,并成功上传到s3。
但我的形象已经败坏了。出于某种原因,S3正在添加一些标题到我的图像(比较图像附件)。
我做错了什么?
获取签名的URL:

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

上传到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);
        });

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

zysjyyx4

zysjyyx41#

我知道这是旧的,但我挣扎了一段时间同样的问题。使用预签名的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);
    })
sbdsn5lh

sbdsn5lh2#

来到这里在2023年,面临着同样的问题使用formdata,但在 Postman ,在把它交给前端部门。
要在postman中处理它,请使用请求体的类型binary

不要忘记添加适当的标题。

gr8qqesn

gr8qqesn3#

我遵循了上面的react js解决方案
在上传图像之前,我所做的是通过HTTP对象URL,然后将其传递给API主体。

if (e.target.files && e.target.files[0]) {
            let img = e.target.files[0];
            **setImage(URL.createObjectURL(img))**

正确方法:

if (e.target.files && e.target.files[0]) {
            let img = e.target.files[0];
            **setImage(img)**

为我工作,谢谢山姆门罗

qgzx9mmu

qgzx9mmu4#

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

相关问题