我希望我的用户上传个人资料图片。现在我可以选择一个文件并将其传递给 POST 请求正文。我正在使用 Node.js + JavaScript。
我正在使用 DigitalOcean 的 Spaces 对象存储服务来存储与 S3 兼容的图像。
理想情况下,我的存储将文件存储为实际图像。相反,它使用 Content-Type application/octet-stream 存储为一个奇怪的文件。我不知道我应该如何使用它——通常是为了显示图像,我只是引用承载图像的 URL,但在这种情况下 URL 指向这个奇怪的文件。它被命名为 VMEDFS3Q65JV4B7YQKLS(无扩展名)。该文件的大小为 14kb,这似乎是正确的,并且它似乎保存了文件数据。它看起来像这样:
ETC...
我知道我正在抓取正确的图像,并且我知道数据库已正确连接,因为它正在发布到正确的位置,我只是对文件类型不满意。
前端请求:
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);
});
我试过的:
- 在请求中添加内容类型标头,在后面添加内容类型参数
- 在后端获取数据的其他方法——它们都产生相同的结果
- 从 req.body 中获取文件后未对文件进行字符串化
- 将 POST 请求更改为 PUT 请求
将不胜感激任何见解 a) 将此八位字节流文件转换为图像或 b) 将此图像作为图像上传。谢谢