我在 AWS S3 存储桶中保存了一个视频/mp4 文件,当用户单击图标时,应从客户端设备(手机或计算机)下载该文件。我首先使用发出请求fetch,然后创建一个blob响应中的对象。接下来,我使用 javascript 创建一个锚元素,附加 href 属性并触发它的单击,如下面的代码所示:
fetch(url, {
headers: new Headers({
'Content-Disposition': "attachment; filename='file-name.mp4'",
}),
}).then((response): void => {
if (!response.ok) {
console.log('Error', response);
}
response.blob().then((blob): void => {
let videoUrl = window.URL.createObjectURL(blob);
let a = document.createElement('a');
document.body.appendChild(a);
a.href = videoUrl;
a.download = 'file-name.mp4';
a.target = '_blank';
a.click();
document.body.removeChild(a);
});
});
测试此代码时,它可以在 Android Chrome 和 iOS Safari 上运行,但不能在 iOS Chrome 上运行。我可以看到请求已被触发,但没有任何反应,甚至没有打开新选项卡。
我尝试过其他一些方法,例如使用文件保存器.js https://github.com/eligrey/FileSaver.js库,也直接尝试了文件阅读器 https://developer.mozilla.org/en-US/docs/Web/API/FileReader就像下面的例子一样,但仍然不起作用。
fetch(url, {
headers: new Headers({
'Content-Disposition': "attachment; filename='file-name.mp4'",
}),
}).then((response): void => {
if (!response.ok) {
console.log('Error', response);
}
response.blob().then((blob): void => {
FileSaver.saveAs(blob, 'file-name.mp4');
});
});
fetch(url, {
headers: new Headers({
'Content-Disposition': "attachment; filename='file-name.mp4'",
}),
}).then((response): void => {
if (!response.ok) {
console.log('Error', response);
}
response.blob().then((blob): void => {
let reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = (): void => {
if (reader.result) {
let url = reader.result.toString();
window.open(url, '_blank');
}
};
});
});
blob 类型是“application/octet-stream”。有没有人遇到过类似的问题或有任何其他新方法的想法?谢谢你!