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 实际文件大小也略有增加。
正如您的问题的不同评论所示,有几件事可能会引发您的问题。
请确保您提供了有关应被视为二进制的不同内容类型的必要配置。AWS 文档提供了有关它的详细信息;这个相关的问题也很有价值。
由于您正在使用该serverless框架,如您引用的链接1 2所示,请同时提供必要的配置:
provider:
apiGateway:
binaryMediaTypes:
- 'multipart/form-data'
Run Code Online (Sandbox Code Playgroud)
无论如何,即使使用此配置,您仍然面临问题。您告诉您能够成功上传文本文件,但是您的图像被损坏,增加了它们的大小:如评论中所示,这似乎清楚地表明在某些地方信息正在转换为不同的编码,从二进制到文本,类似的东西。事实上,根据您的依赖关系,这似乎是实际问题,正如本期库中所报告的那样serverless-http,尤其是库的其他1和2serverless-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问题解决。
| 归档时间: |
|
| 查看次数: |
5293 次 |
| 最近记录: |