想请问下,目前有一个前端下载文件的需求,之前用axios实现过了分片传输下载,但是有一个问题在于是各个分片下载完成并合并之后,才在浏览器的下载栏中显示。而一般的下载则是可以在浏览器的下载栏中显示的,看了网上很多博客和教程都没有使用浏览器自带下载功能实现分片传输的方法。想请问下这是有可能实现的吗?
1.实现过正常的直接用axios实现的分片传输。
2.使用浏览器自带的下载一般似乎是通过下面的步骤进行的:
function triggerDownload(url, filename) {
const link = document.createElement('a');
const downloadUrl = `${url}?token=${encodeURIComponent(getToken())}`;
link.href = downloadUrl;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
/**
* 使用浏览器默认的范围请求下载文件
* @param {string} filename 文件名
*/
export function downloadFilesDefault(filename) {
// 构建下载URL,包含认证信息或必要的参数
const downloadUrl = `${window.g.BASE_URL}compilation/rangeDownload`;
triggerDownload(downloadUrl, filename);
}
但是这种一开始就点击标签进行下载的,怎么实现多次请求的分片传输呢?
还有一个额外的问题想请教各位~
因为之前没怎么关注过下载这部分,所以比较疑惑如果浏览器本身自带了下载的功能,包括断点重试之类的话,那么一般企业中的实际应用场景是怎么样的呢?
使用浏览器本身来下载文件的时候多吗?
什么时候会考虑使用api自定义实现各种下载方式呢?
如果只考虑 Chromium 内核的浏览器,并且可以得到用户支持(毕竟支持网站直接读写文件是一件很危险的事情)的话,可以考虑 FileSystem 。
使用 FileSystem
,JS 就可以以 stream
的形式向文件尾部追加内容,而fetch
API 恰好支持使用 pipeTo
读取,也就是可以在请求数据的同时,向文件里写入:
async function writeURLToFile(fileHandle, url) {
// Create a FileSystemWritableFileStream to write to.
const writable = await fileHandle.createWritable();
// Make an HTTP request for the contents.
const response = await fetch(url);
// Stream the response into the file.
await response.body.pipeTo(writable);
// pipeTo() closes the destination pipe by default, no need to close it.
}
chrome.cn 提供的例子,这里展示的是向文件写入流,分片应该就是等上一个流关闭之后,请求下一个片段并继续写入了。
问题内容: 我正在使用seleniumjava工作,需要下载pdf文件,但是在我的情况下似乎没有任何效果。是由于设置了新的firefox驱动程序实例ie吗?我被困在这里。但是,当我在MIME对话框上手动单击保存文件时,它可以正确保存到我的自定义位置,我的下载链接代码也位于另一个Java类中,而位于另一个类的下面,但是我使用的驱动程序与在此类中声明的,以下是我的代码, 问题答案: 以下代码块使用直通
我正在使用selenium java来下载pdf文件,我在这里引用了这个,这个和这个答案,但似乎没有什么在我的情况下工作。是否由于设置了新的firefox驱动程序实例,即?然而,当我手动单击MIME对话框中的save file时,它会正确地保存到我的自定义位置,我的下载链接代码也位于另一个java类中,下面的代码位于另一个类中,但我使用了与该类中声明的相同的驱动程序,下面是我的代码,
从互联网下载图片,并显示。下载图片过程中显示进度条。支持图片缩放,运用了ASI、SDWebImage。支持图片缓存。 [Code4App.com]
问题内容: 单击图像后,是否可以将其下载(没有右键单击 将图像另存为 )? 我正在使用一个小的Javascript函数来调用下载页面: 在download.php页面中,我有类似以下内容: 但这是行不通的。我究竟做错了什么? 提前致谢! 问题答案: 使用 application / octet- stream 代替 image / jpg : 如果在应用程序/八位字节流内容类型的响应中使用[Con
> 如果我想直接从浏览器保存一些东西,它需要我的应用程序的API密钥,我不能把它放在HTML中,因为它不安全。 如果我试图在网页调用我的服务器的地方做任何事情,文件将必须通过我的服务器才能到达谷歌。
我正在尝试以分块模式发送数据。正确设置所有标题,并相应地对数据进行编码。浏览器将我的响应识别为分块响应,接受标题并开始接收数据。 我希望浏览器会更新每个接收到的区块的页面,而不是等到所有区块都被接收,然后显示它们。这是预期的行为吗? 我希望看到每个块在收到后立即显示。使用时,每个块在收到后立即显示。为什么GUI浏览器不会发生同样的情况?他们是否在使用某种缓冲/缓存? 我将标头设置为,所以不确定它是
问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因