将图像上传到 S3 存储桶将其存储为应用程序/八位字节流,但我想将其存储为图像以使用它JavaScript / Node

问题描述

我希望我的用户上传个人资料图片。现在我可以选择一个文件并将其传递到 POST 请求正文中。我正在使用 Node.js + JavaScript。

我正在使用 DigitalOcean 的 Spaces 对象存储服务来存储我的图像,该服务与 S3 兼容。

理想情况下,我的存储将文件存储为实际图像。相反,它存储为一个带有 Content-Type 应用程序/八位字节流的奇怪文件。我不知道我应该如何处理这个——通常是为了显示图像,我只是引用托管图像的 URL,但在这种情况下,URL 指向这个奇怪的文件。它的名称类似于 VMEDFS3Q65JV4B7YQKLS(无扩展名)。该文件的大小为 14kb,这似乎是正确的,它似乎包含文件数据。它看起来像这样:

enter image description here

等等...

我知道我正在抓取正确的图像,并且我知道数据库已正确连接,因为它正在发布到正确的位置,我只是对文件类型不满意。

前端请求:

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,}

^^已添加内容类型。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...