我有一个S3(AWS)存储桶,用于存储mp3文件。我正在开发一个使用amplify init
通过Amplify CLI初始化的应用程序,使用amplify add storage
(S3)设置了S3存储,并且(create-react)应用程序是通过连接Amplify发布的通过Amplify Console进行回购。
下面介绍的方法Storage.put()
和Storage.get()
是通过NPM安装的aws-amplify
库(v1.1.29)的一部分。
使用Storage.put()
时,我可以设置(或不设置)文件的Content-Type和Content-Disposition。
如果我将Content-Type设置为audio/mpeg
,并且将Content-Disposition设置为“ attachment”,则可以使用Storage.get()
检索预签名的URL,这将提示OS下载窗口保存该URL。文件。
如果仅将Content-Type设置为audio/mpeg
,而将Content-Disposition保留为默认值(“内联”),则Storage.get()
将返回一个预签名的URL,该URL将开始流式传输/播放文件在浏览器中。
这似乎是一条非此即彼的道路。
我最终想要做的是允许在UI中同时进行流式传输和/或下载,并且具有适当的行为的播放和下载按钮:
虽然我可以通过以下方法在PUT上设置Content-Type和Content-Disposition:
用于下载
await Storage.put(fileName, file, {
contentType: "audio/mpeg",
contentDisposition: "attachment",
});
用于流式传输
await Storage.put(fileName, file, {
contentType: "audio/mpeg"
});
我似乎无法弄清楚如何使用GET方法来执行此操作,以覆盖Content-Disposition。
我尝试了以下操作,并使用Content-Type将文件上传到S3:“ audio / mpeg”,没有Content-Disposition,尝试使用带签名的URL覆盖Content-Disposition以允许下载: / p>
const url = await Storage.get(fileName, {
contentDisposition: "attachment"
});
和
const url = await Storage.get(fileName, {
response-content-disposition: "attachment",
});
但是,下载与流的行为将始终默认为S3中在文件上设置的Content-Disposition,并且不会发生覆盖。
任何对此的想法将不胜感激。
注意:我也在Amplify-JS Github repo上为此打开了一个问题,因此,如果我从那里得到任何反馈,我会将结果发布在这里。