我有一个用于媒体文件存储的 S3 存储桶,最重要的是用于 mp4 视频。所有这一切都有一个网络前端。 (不涉及 CloudFront,而且由于额外费用,我不想注册 CloudFront。)当浏览器遇到 mp4 视频的原始 URL 时,默认行为是在单击时播放 mp4 文件(无论是就地还是在一个新选项卡,具体取决于
target
HTML 标记)。然后,您可以从本机浏览器播放器下载视频,但这需要多次点击,我们谈论的是播放列表中有时有 40 个视频,与仅下载视频相比,这将是一个巨大的生产力打击。
因此,可以理解的是,用户需要一个下载按钮,该按钮允许下载视频而不是播放视频。经过几个小时的研究,我偶然发现了 StreamSaver.js,它效果很好,我什至可以为下载的视频指定一个有意义的名称(包含运动员姓名、位置、球衣# 等),而不是 GUID,但有一个缺点:我遇到了 CORS 政策错误,例如
Access to fetch at 'https://sportsboardmedia.s3.amazonaws.com/uploads/video/{GUID}_{GUID}.mp4' from origin 'https://app.sportsboard.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
我的水桶从一开始就可供公众使用。经过一番研究后,我将我的存储桶切换到静态网站托管模式(根据此 SO 条目),并且我还应用了此 SO 条目建议的 CORS 策略。
目前的情况是,某些视频文件现在可以下载,但其他文件(我们正在谈论同一个存储桶)仍然会抛出 CORS 错误。这怎么可能呢?据我所知,CORS 策略应该对整个存储桶是全局的,并且从 CORS 的角度来看,每个文件都应该是相等的。我从哪里开始解决这个问题?我几天前应用了此 CORS 政策,我的存储桶包含大约 5TB 的视频。我认为这对亚马逊来说并不是什么大问题。这是一个运动员储物柜示例,其中一些视频抛出 CORS 错误:
https://app.sportsboard.io/playerlocker/media/event/6272C5BE-CE03-4344-BED1-29369306C831/5e267f70-f1de-11e7-b8d3- f23c91087063/视频/
https://forums.aws.amazon.co/thread.jspa?messageID=991094#991094
https://iq.aws.amazon.com/p/N3SFMRLKRH
对我有用的是在资源 url 之后添加一个随机参数。例如添加“?随机= 1”。
所有视频现在加载 200。我使用的是 Chrome。听起来通过添加随机参数可能会绕过一些不合理的、不可删除的缓存。我还是不知道是什么原因。