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

Java 无法播放使用预签名URL上传到AWS S3的mp4视频,java,amazon-web-services,amazon-s3,aws-sdk,Java,Amazon Web Services,Amazon S3,Aws Sdk,我正在使用预先签名的URL将mp4视频上载到AWS S3,上载成功,但当我尝试从S3下载视频并在媒体播放器(VLC或quickTime)中播放时,它无法播放 生成的预签名URL可以在mp3中正常工作,但在WAV和FLAC中也会出现上述问题 生成预签名url的代码: 公共字符串getPreSignedS3Url(最终字符串用户ID,最终字符串文件名) { 到期日期=新日期(); long-expTimeMillis=expiration.getTime(); expTimeMillis+=urlE

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

生成的预签名URL可以在
mp3
中正常工作,但在
WAV
FLAC
中也会出现上述问题

生成预签名url的代码:

公共字符串getPreSignedS3Url(最终字符串用户ID,最终字符串文件名)
{
到期日期=新日期();
long-expTimeMillis=expiration.getTime();
expTimeMillis+=urlExpiration;
expTimeMillis(expTimeMillis);
String objectKey=StringUtils.getObjectKey(用户ID,文件名);
GeneratePressigneDurlRequest GeneratePressigneDurlRequest=新的GeneratePressigneDurlRequest(
recordingBucketName,objectKey)
.withMethod(HttpMethod.PUT)
.到期(到期);
URL URL=s3Client.generatePressignedUrl(generatePressignedUrlRequest);
返回url.toString();
}
从上述方法获得预签名URL后,我使用请求正文中的多部分/表单数据从Postman发出HTTP PUT请求,如下所示:

-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
预签名url如下所示:

-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
我尝试使用
generatePresignedUrlRequest.setContentType(“视频/mp4”)在
getPreSignedS3Url()
方法中将内容类型设置为mp4
并在HTTP PUT请求头中添加
内容类型:“video/mp4”
,但它不工作,并且失败,出现错误
签名不匹配

我使用S3作为我的个人备份硬盘,我希望使用预先签名的URL将视频和音频文件上传到S3,在将来的某个时候下载并能够播放它们,但下载后我无法播放它们


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

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

谢谢,我会尝试一下,但是为什么
multipart/form data
适用于
mp3
?除非mp3播放器在解释文件时过于慷慨,否则我想不出一个解释来解释为什么可以这样做。在上载文件之前和下载文件之后,使用md5sum或sha256sum等工具计算文件的校验和,您会发现以这种方式上载实际上会损坏文件。一个更简单的测试,您还应该发现下载的文件实际上比原始文件大。如果大小和校验和匹配,那么您实际上并没有发送多部分/表单数据,但这似乎不太可能。