5

我正在尝试使用预签名的 url 将 jpeg 图像从 iOS 设备上传到 S3。这就是我正在做的事情:

const file = {
  uri: imageURL,
  type: 'image/jpeg'
};

const formData = new FormData();
formData.append('photo', file);
formData.append('Content-Type', 'image/jpeg');

const response = await axios({
  method: 'PUT',
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  url: s3PreSignedURL,
  data: formData
});

(该应用程序在 react native 中,我使用 react-native-camera 拍照。)

问题是图像被上传。当我下载它并尝试在我的 Mac 上查看时,它显示The file could not be opened. 但如果我在 Photoshop 中打开它,它就可以工作。知道发生了什么吗?

您可以在此处找到示例图像:https ://s3-ap-southeast-1.amazonaws.com/eyesnapdev/scans/1509856619481-7180​​9992-b818-4637-93f1-9a75b6588c2c.jpg

4

2 回答 2

1

您上传的图像保存了整个多部分表单数据,并且还包含以下信息(在文本编辑器中打开您的 s3 jpg 图像以查看):

--K_B9dYtGXt4.LjeMIncq0ajcL6vDRYqD1hRiwoIOJzPKYTVi8jTYT_f07RZw37Om1NJwGi content-disposition: form-data; name="photo" content-type: image/jpeg

s3 upload 只希望在 post 中上传文件的数据,而不是多部分的形式。

在挖掘 React 本机核心之后,我认为下面的代码应该可以工作。我自己还没有尝试过:

fetch(s3PreSignedURL,{
    method:"PUT",
    headers: {
      'Content-Type': 'image/jpg'
    },
    body:{uri:imageURL}
});

或使用 axios:

axios({
  method: 'PUT',
  headers: {
    'Content-Type': 'image/jpg'
  },
  url: s3PreSignedURL,
  body:{uri:imageURL} 
});
于 2017-11-13T12:38:09.190 回答
1

似乎您没有formData用来发送图像,而应该是这样的:

const file = {
  uri: imageURL,
  type: 'image/jpeg'
};

const formData = new FormData();
formData.append('photo', file);
formData.append('Content-Type', 'image/jpeg');

const response = await axios({
  method: 'PUT',
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  url: s3PreSignedURL,
  data: formData // not **file**
});
于 2017-11-05T06:32:26.540 回答