Please enable Javascript to view the contents

如何突破 Chrome 浏览器自动下载文件不超过 10 个的限制

 ·  ☕ 2 分钟

我写的字幕工具箱中有一个批量双语字幕合并的功能,批量双语字幕合并 —— 字幕工具箱

今天有用户反馈在 Chrome 浏览器上使用时,自动下载的文件数量被限制为 10 个,超过 10 个后就无法继续下载。

javascript - 在 Chrome 浏览器上自动下载文件限制为 10 个文件 - Stack Overflow — javascript - Automatic file downloads limited to 10 files on Chrome browser - Stack Overflow

经过调查发现,这是 Chrome 浏览器的一个限制,默认情况下,浏览器会限制自动下载的文件数量为 10 个,以防止恶意网站进行大量下载。

有两种解决方法:

间隔下载

如果您在每 10 次下载之间暂停一秒钟,则所有下载都将在 Chrome 中运行。当然,简单起见,也可以在每一次下载之后暂停一秒钟。

所以,首先可以写一个延迟函数,在每次下载后等待一段时间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 创建延迟函数
const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));

const handleBatchMergeAndDownload = async () => {
    for (let i = 0; i < matchedFiles.length; i++) {
        const group = matchedFiles[i];
        await handleMergeAndDownload(group);
        
        // 如果不是最后一组,则等待1秒
        if (i < matchedFiles.length - 1) {
        await delay(1000);
        }
    }
};

zip 打包下载

如果您需要下载的文件数量较多,或者希望用户能够一次性下载所有合并后的字幕文件,可以将这些文件打包成一个 ZIP 文件,然后提供下载链接。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import JSZip from 'jszip';

const handleBatchMergeZipDownload = async () => {
    try {
        const zip = new JSZip();
        
        // 处理所有文件组
        for (const group of matchedFiles) {
        if (group.length < 2) continue;
        
        const mergedContent = await mergeSubtitles(group);
        
        // 为合并后的文件创建文件名
        const firstFileName = group[0].name;
        const getBaseName = (name: string) => name.split('.').slice(0, -1).join('.');
        const getExtension = (name: string) => name.split('.').pop();
        const baseName = getBaseName(firstFileName);
        const extension = getExtension(firstFileName);
        const mergedFileName = `${baseName}_merged.${extension}`;
        
        // 添加到zip文件
        zip.file(mergedFileName, mergedContent);
        }
        
        // 生成zip文件
        const zipContent = await zip.generateAsync({ type: 'blob' });
        
        // 创建下载链接
        const url = URL.createObjectURL(zipContent);
        const a = document.createElement('a');
        a.href = url;
        a.download = `merged_subtitles_${new Date().toISOString().slice(0,10)}.zip`;
        a.click();
        URL.revokeObjectURL(url);
    } catch (error) {
        console.error('创建ZIP文件时出错:', error);
        alert('打包下载失败,请重试');
    }
};

参考资料

分享

码农真经
作者
码农真经
Web Developer