问题描述
我希望我的用户上传个人资料图片。现在我可以选择一个文件并将其传递到 POST 请求正文中。我正在使用 Node.js + JavaScript。
我正在使用 DigitalOcean 的 Spaces 对象存储服务来存储我的图像,该服务与 S3 兼容。
理想情况下,我的存储将文件存储为实际图像。相反,它存储为一个带有 Content-Type 应用程序/八位字节流的奇怪文件。我不知道我应该如何处理这个——通常是为了显示图像,我只是引用托管图像的 URL,但在这种情况下,URL 指向这个奇怪的文件。它的名称类似于 VMEDFS3Q65JV4B7YQKLS(无扩展名)。该文件的大小为 14kb,这似乎是正确的,它似乎包含文件数据。它看起来像这样:
等等...
我知道我正在抓取正确的图像,并且我知道数据库已正确连接,因为它正在发布到正确的位置,我只是对文件类型不满意。
前端请求:
fetch('/api/image/profileUpload',{
method: 'PUT',body: { file: event.target.files[0] },'Content-Type': 'image/jpg',})
后端代码:
const AWS = require('aws-sdk')
let file = req.body;
file = JSON.stringify(file);
AWS.config.update({
region: 'nyc3',accessKeyId: process.env.SPACES_KEY,secretAccessKey: process.env.SPACES_SECRET,});
const s3 = new AWS.S3({
endpoint: new AWS.Endpoint('nyc3.digitaloceanspaces.com')
});
const uploadParams = {
Bucket: process.env.SPACES_BUCKET,Key: process.env.SPACES_KEY,Body: file,ACL: "public-read",ResponseContentType: 'image/jpg'
};
s3.upload(uploadParams,function(err,data) {
if (err) console.log(err,err.stack);
else console.log(data);
});
我尝试过的:
- 在请求中添加 content-type 标头并在后面添加 content-type 参数
- 在后端获取数据的其他方法 -- 它们都会导致相同的结果
- 从 req.body 中抓取文件后不对其进行字符串化
- 将 POST 请求更改为 PUT 请求
如果您对 a) 将此八位字节流文件转换为图像或 b) 将此图像作为图像上传,我们将不胜感激。谢谢
解决方法
我稍微解决了这个问题——我将参数更改为:
"compilerOptions": {
// other options
"noImplicitAny": false,}
^^已添加内容类型。
它仍然不存储实际图像,但这是一个不同的问题。