【问题标题】:uploading an image to S3 via javascript AWS sdk results in '[object object]' string通过javascript AWS sdk将图像上传到S3会导致“[object object]”字符串
【发布时间】:2019-03-21 23:02:05
【问题描述】:

通过关注this tutorial,我正在尝试使用以下代码将图像从我的 ionic 应用程序上传到 amazon s3 存储桶:

uploadFile(filePath) {
    console.log('uploading: ', filePath);
    this.getFile(filePath).subscribe((file) => {
       console.log('file is', file);

       this.s3.upload({
          Key: file.name,
          Bucket: this.bucketName,
          Body: file,
          ACL: 'public-read'
        }, (err, data) => {
           console.log('error', err);
           console.log('data', data);
     })
   });
}

getFile(filePath):Observable<any> {
  return Observable.create((obs) => {
    (<any>window).resolveLocalFileSystemURL(filePath,(fileEntry) => {
      fileEntry.file((fileObject) => {
        obs.next(fileObject);
      })
    })
  });
}

这可以很好地连接到 aws,但它上传的文件只是一个带有 [object object] 的文本文件,而不是 jpeg 图像数据。对于上下文,filePath 参数被传递给通过 Ionic 3 @ionic-native/camera 库生成的图像的文件路径,我正在通过 android 模拟器运行代码,如果这有什么不同的话。

我很确定在上传时我将错误类型的对象传递给Body 属性,但我不知道它应该是什么。 AWS 文档说它应该接受Blob 的类型,但是我的getFile 方法返回一个File,这显然是Blob 的一个实例,所以我认为它应该可以正常工作?

【问题讨论】:

    标签: javascript amazon-web-services amazon-s3 ionic3 aws-sdk


    【解决方案1】:

    看起来GetFile 方法返回一个File 对象而不是一个blob。 所以什么时候,你写:

    Body: file,
    

    你实际上是在传递那个 JS 对象,而不是一个 blob。 这是一个对象的证明是 file.name 实际上确实返回了一个名称。

    我建议您查看fileEntry.file 的文档以检查如何从返回的File 对象访问字节数组。

    来自科尔多瓦documentation

    file: Creates a File object containing file properties.

    也许FileReader 会帮助您实际阅读文件。 https://cordova.apache.org/docs/en/1.8.1/cordova/file/filereader/filereader.html

    【讨论】:

    • 你是对的!我使用FileReader 将文件作为数组缓冲区读取,并将其传递给Body 似乎可行。不过这很奇怪,因为 aws sdk 文档说Body 应该接受Blob,其中File 是一个实例。我原以为File 也应该可以工作。
    猜你喜欢
    • 2012-06-06
    • 2014-08-15
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2018-11-28
    • 2020-07-06
    相关资源
    最近更新 更多