通过Expo ImagePicker将反应原生的上传图像添加到S3

时间:2018-06-19 06:24:55

标签: amazon-web-services react-native amazon-s3 expo aws-amplify

我想将照片上传到S3存储桶,我目前正在使用世博会并使用aws-ampl来接近这个。

获取本地图像的代码如下:

import { ImagePicker } from 'expo';

ImagePicker.launchImageLibraryAsync({
  mediaTypes: 'Images',
  allowsEditing: true,
  aspect: [1, 1],
  base64: true
})
.then(image => dispatch(pickImageSuccess(image)))
.catch(err => dispatch(piclImageFail(err)));

获取图像后,我通过{ Storage } from 'aws-amplify'

将图像上传到s3存储桶
import { Storage } from 'aws-amplify';

const file = image.base64;
const imageName = image.uri.replace(/^.*[\\\/]/, '');
console.log(imageName);
const access = { level: "public", contentType: 'image/jepg' };
Storage.put(`${username}/${imageName}`, file, access)
  .then(succ => console.log(succ))
  .catch(err => console.log(err));

在 我上传了图片,我试图在S3存储桶中打开图像。图像无法正常打开,除非我在S3存储桶中将文件标记为公开,否则我无法公开访问图像。

1 个答案:

答案 0 :(得分:1)

找出问题所在。来自Storage的put()方法需要blob作为参数。以下是我为实现这一目标所做的工作。

import { ImagePicker } from 'expo';
import mime from 'mime-types';
import { Storage } from 'aws-amplify';


const imageName = image.uri.replace(/^.*[\\\/]/, '');
const fileType = mime.lookup(image.uri);
const access = { level: "public", contentType: fileType, };
fetch(image.uri).then(response => {
  response.blob()
    .then(blob => {
      Storage.put(`${username}/${imageName}`, blob, access)
        .then(succ => console.log(succ))
        .catch(err => console.log(err));
    });
});