2

我希望我的用户上传个人资料图片。现在我可以选择一个文件并将其传递给 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) 将此图像作为图像上传。谢谢

4

1 回答 1

0

我在一定程度上解决了这个问题——我将参数更改为:

const uploadParams = {
    Bucket: 'oscarexpert',
    Key: 'asdff',
    Body: image,
    ContentType: "image/jpeg",
    ACL: "public-read",
  };

^^添加了内容类型。

它仍然不存储实际图像,但这是一个不同的问题。

于 2021-03-05T21:11:30.850 回答