无法查看 s3 上传的图像文件

KIR*_*K J 4 javascript amazon-s3 amazon-web-services serverless-framework serverless

我正在使用 s3 上传图像文件。但每当我尝试使用 URL 以及从 s3 控制台下载时,都会下载图像文件。但是,图像查看器将看不到它。它只是显示不兼容的文件类型。

myS3Function.uploadFile(request.body.fileName, request.files.myFileData, "image_folder").then(filename => {
 //success
})
Run Code Online (Sandbox Code Playgroud)

const AWS = require('aws-sdk');

const s3 = new AWS.S3({
 region: process.env.REGION
});

exports.uploadFile  = (filename, data, folderName) => {
return new Promise((resolve, reject) => {
    const params = {
        Bucket: process.env.AWS_S3_BUCKET, 
        Key: folderName+'/'+filename,
        Body: data.data,
        ACL:'public-read',
        ContentType: "image/jpeg"
    };
    s3.upload(params, function(s3Err, data) {
        if (s3Err) reject(s3Err)
        console.log(`File uploaded successfully at ${data.Location}`)
        resolve(`${data.Location}`)

    });
});
}
Run Code Online (Sandbox Code Playgroud)

我现在使用邮递员上传文件作为表单数据。我可以正确地看到使用此代码上传的文本文件。那么为什么图像会出现这个问题呢?此外,图像和 pdf 实际文件大小也略有增加。

在此输入图像描述

在此输入图像描述

jcc*_*ero 5

正如您的问题的不同评论所示,有几件事可能会引发您的问题。

请确保您提供了有关应被视为二进制的不同内容类型的必要配置。AWS 文档提供了有关它的详细信息;这个相关的问题也很有价值。

由于您正在使用该serverless框架,如您引用的链接1 2所示,请同时提供必要的配置:

provider:
  apiGateway:
    binaryMediaTypes:
      - 'multipart/form-data'
Run Code Online (Sandbox Code Playgroud)

无论如何,即使使用此配置,您仍然面临问题。您告诉您能够成功上传文本文件,但是您的图像被损坏,增加了它们的大小:如评论中所示,这似乎清楚地表明在某些地方信息正在转换为不同的编码,从二进制到文本,类似的东西。事实上,根据您的依赖关系,这似乎是实际问题,正如本期库中所报告的那样serverless-http,尤其是库的其他12serverless-offline中所报告的。

我认为这个问题只是本地的,并且它可能会在 AWS 中正​​常运行而不会出现更多问题。

无论如何,正如您在上述第一个问题(与 相关的问题)中看到的serverless-http,该库具有以下代码:

return Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8'); 
Run Code Online (Sandbox Code Playgroud)

因此,作为一种解决方法,以 Base 64 编码提交信息可以解决该问题:如果您在 HTML 中使用表单提交,这不是一个简单的任务 - 例如,请参阅这个很好的示例以了解一些想法 - 尽管它可以解决问题如果您通过代码直接与 API 交互。唯一需要的更改是您的 params 变量:

const params = {
  Bucket: process.env.AWS_S3_BUCKET, 
  Key: folderName+'/'+filename,
  Body: Buffer.from(data.data, 'base64'),
  ContentEncoding: 'base64',
  ContentType: 'image/jpeg',
  ACL:'public-read',
};
Run Code Online (Sandbox Code Playgroud)

请注意 的使用Buffer.from(..., 'base64')和包含ContentEncoding: 'base64'

无论如何,如果代码可以在 AWS 中运行,我认为最好的方法就是等待serverless-offline问题解决。