无法播放使用预签名URL上传到AWS S3的mp4视频

时间:2019-07-20 13:17:07

标签: java amazon-web-services amazon-s3 aws-sdk

我正在使用预先签名的URL将mp4视频上传到AWS S3,上传成功,但是当我尝试从S3下载视频并在媒体播放器(VLC或quickTime)中播放时,它不会播放!。

生成的预签名URL在mp3下可以正常工作,但是对于WAVFLAC也会发生与上述相同的问题。

用于生成预签名网址的代码:

public String getPreSignedS3Url( final String userId, final String fileName )
    {
        Date expiration = new Date();
        long expTimeMillis = expiration.getTime();
        expTimeMillis += urlExpiry;
        expiration.setTime(expTimeMillis);

        String objectKey = StringUtils.getObjectKey( userId, fileName );

        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
                recordingBucketName, objectKey)
                .withMethod(HttpMethod.PUT)
                .withExpiration(expiration);

        URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

        return url.toString();

    }

从上面的方法中获得预签名的URL后,我从邮递员发出HTTP PUT请求,并在请求正文中添加multipart / form-data,如下所示:

-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -F 'file=@/Users/john/Downloads/sampleDemo.mp4'

预签名网址如下:

https://meeting-recording.s3.eu-west-2.amazonaws.com/331902257/sampleDemo.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20190720T125751Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3599&X-Amz-Credential=AKIAZDSMLZ3VDKNXQUXH%2F20190720%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Signature=dfb8054f0738e07e925e9880e4a8e5ebba0a1bd3c84a3ec78913239f65221992

我尝试使用getPreSignedS3Url()generatePresignedUrlRequest.setContentType( "video/mp4" );方法中将内容类型设置为mp4,并在HTTP PUT请求标头中添加Content-Type : "video/mp4",但是它没有用,并且失败了。错误Signature doesn't match

我将S3用作个人备份硬盘,我希望使用预先签名的URL将视频和音频文件上传到S3,以后再下载它们并可以播放,但是下载后我无法播放它们。

有人知道这是什么原因吗?

1 个答案:

答案 0 :(得分:0)

对S3的

PUT请求不支持multipart/form-data。请求主体只需要包含二进制对象数据即可。如果您从S3下载现有文件并使用文本编辑器将其打开,则会发现S3保留了文件内部的多部分表单结构,而不是将其解释为实际有效内容的包装。