0

我一直在尝试将视频上传到 S3 一段时间,并希望得到一些指示。目前,我已阅读并被告知我们需要将实际文件发送到 S3 而不是 url(如果我们在 aws 之前将其发送到后端,我们可能会这样做)。

我正在尝试通过

const getBlob = async (fileURi) => {
    console.log('THIS IS IT', fileURi);
    const resp = await fetch(fileURi);
    const videoBody = await resp.blob();
    console.log(videoBody);
};
getBlob(video.uri);

我遇到的问题是我无法实际获取视频文件。当我停止录制视频时await camera.stopRecording();,我得到的回报是

Object {
  "uri": "file:///path/20DD0E08-11CA-423D-B83D-BD5ED40DFB25.mov",
}

是否有推荐的方法来成功获取实际文件以便通过客户端将其发送到 S3?

我目前尝试发送不起作用的视频的方式是:

    const formData = new FormData();
    formData.append('file', video.uri);

    await fetch(url, {
        method: 'POST',
        body: formData,
        headers: {
            'Content-Type': 'multipart/form-data'
        }

url:指的是我们从aws返回的presignedUrl。

PS - 通过 fetch 调用发送到服务器确实有效,但我注意到这种方法也会让用户等待 10 多秒,因为我需要将视频发送到服务器然后等待它完成在 AWS 中的上传。

谢谢大家的帮助。

4

2 回答 2

0

如果我理解正确,您知道如何将文件上传到您自己的服务器,但您想将其直接发送到 S3。

在这种情况下,我建议使用预签名 URL。https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html

您可以在后端生成预签名 URL,它基本上是指向 S3 文件和一些键值的常规 URL。您需要将这些值发送到移动应用程序并执行您已经在使用的相同 fetch 调用,但将 url 替换为后端生成的 URL 并将所有键值添加到 FormData。

节点后端的示例如下所示

import AWS from 'aws-sdk';
...

const client = new AWS.S3(config);
...
    const presignedUrl = client.createPresignedPost({
      Bucket: 'example-bucket-name',
      Fields: { key: 'example-file-name' },
    });

在移动应用程序中,您会

    const form = new FormData();
    Object.keys(presignedUrl.fields).forEach(key => {
       form.append(key, presignedUrl.fields[key]);
    })
    form.append('file', fileToUpload);

    await fetch(presignedUrl.url, {
        method: 'POST',
        body: form,
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    })
于 2020-09-01T23:36:55.190 回答
0

我的解决方案。请查看示例应用程序。https://github.com/expo/examples/tree/master/with-aws-storage-upload

const response = await fetch(video.uri);
        const blob = await response.blob();
        const params = {
            Bucket: myBucket,
            Metadata: {
                long: long.toString(),
                lat: lat.toString(),
                size: videoSize.toString()
            },
            Key: myKey,
            Body: blob
        }; 
于 2021-09-03T23:13:56.437 回答