通过Stitch AWS服务上传图片到S3失败

4
抱歉我是个新手,但我正在使用mongodb stitch作为后端构建quasar前端。 我正在尝试使用stitch javascript sdks和AwsRequest.Builder上传图像。 Quasar给我一个带有base64编码数据的图像对象。 我从base64字符串中删除头字符串(即“data:image/jpeg;base64,”部分),将其转换为二进制并将其上传到AWS s3存储桶。 我可以很好地上传数据,当我再次下载时,我得到了我上传的确切字节,因此通过stitch到aws S3再回来的往返似乎有效。 只有上传的图像既无法在S3中打开,也无法在下载后打开。 困难似乎在于将base64字符串转换为二进制和/或选择适当的上传参数以供stitch使用。 这是我的代码:
      var fileSrc = file.__img.src  // valid base64 encoded image with header string
      var fileData = fileSrc.substr(fileSrc.indexOf(',') + 1) // stripping out header string
      var body = BSON.Binary.fromBase64(fileData, 0) // here I get the BSON error

      const args = {
        ACL: 'public-read',
        Bucket: 'elever-erp-document-store',
        ContentType: file.type,
        ContentEncoding: 'x-www-form-urlencoded', // not sure about the need to specify encoding for binary file
        Key: file.name,
        Body: body
      }

      const request = new AwsRequest.Builder()
        .withService('s3')
        .withRegion('eu-west-1')
        .withAction('PutObject')
        .withArgs(args)

      aws.execute(request.build())
        .then(result => {
          alert('OK ' + result)
          return file
        }).catch(err => {
          alert('error ' + err)
        })

在上面的代码片段中,我尝试使用BSON.Binary.fromBase64进行二进制转换,根据Haley下面的建议,但是我得到了以下错误:
boot_stitch__WEBPACK_IMPORTED_MODULE_3__["BSON"].Binary.fromBase64 is not a function.

我还尝试了其他将base64字符串转换为二进制的方法,例如使用原始的atob()函数和BUFFER npm模块,但都没有成功。

我肯定是在某处犯了愚蠢的错误,但我找不到解决方法。

2个回答

1
我遇到了类似的问题,通过从base64数据创建缓冲区,然后使用new BSON.Binary(new Uint8Array(fileBuffer), 0)创建BSON二进制对象来解决它。
使用OP会看起来像这样:
var fileSrc = file.__img.src  // valid base64 encoded image with header string
var fileData = fileSrc.substr(fileSrc.indexOf(',') + 1) // stripping out header string
var fileBuffer = new Buffer(fileData, 'base64');
var body = new BSON.Binary(new Uint8Array(fileBuffer), 0)

0

您应该能够将base64图像转换为BSON.Binary,然后以这种方式上传实际的图像(我已经硬编码了一些值,但是您可以替换它们):

context.services.get("<aws-svc-name>").s3("<your-region>").PutObject({
    Bucket: 'myBucket',
    Key: "hello.png",
    ContentType: "image/png",
    Body: BSON.Binary.fromBase64("iVBORw0KGgoAA... (rest of the base64 string)", 0),
})

谢谢Haley。我从你的帖子中了解到,我需要将base64转换为BSON对象。不幸的是,我拥有的BSON实现(node.js)似乎没有Binary.fromBase64函数。我会在接下来的几天里深入研究它。再次感谢。 - Bruno Ronchetti
所以,我尝试从mongodb-stitch-browser-core包中像这样导入BSON:import { stitchClient,RemoteMongoClient,AwsServiceClient,AwsRequest,BSON } from 'boot/stitch',但我仍然得到TypeError: boot_stitch__WEBPACK_IMPORTED_MODULE_3__["BSON"].Binary.fromBase64不是一个函数。 - Bruno Ronchetti
感谢Haley的跟进,对于任何混淆表示抱歉。我已经编辑了我的问题以便更清晰,并且可以粘贴更多的代码。 - Bruno Ronchetti
尝试使用以下代码:new BSON.Binary(fileData, 0x00) - haley
谢谢Haley。最后我放弃了使用JavaScript SDK。改用Stitch服务和Stitch函数,它按照广告所说的那样工作。 - Bruno Ronchetti
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接