FilePond调用addFiles添加文件报错(禁用IDM后正常)如何解决
问题根因
该问题的核心原因是IDM(Internet Download Manager)的浏览器扩展会自动拦截匹配后缀的文件请求。FilePond调用addFiles传入远程文件URL时,会主动发送GET请求拉取文件的Blob内容用于后续处理,该请求被IDM拦截中断,导致FilePond无法获取到文件数据,触发上传错误,同时也无法将文件写入FormData随表单提交。
可行解决方案
- 方案1:传入已上传文件元数据,跳过远程拉取
如果添加的是已经存储在服务器上的文件,不需要FilePond重复拉取和上传,可以直接传入文件配置对象,标记为已完成的本地文件,避免触发GET请求:
Editpond = FilePond.create( document.querySelector('.file_attachment' + id), { allowMultiple: true, }); // 传入文件元数据,不直接传URL,避免发起拉取请求 Editpond.addFiles([ { source: 'assets/uploads/files/06-30-2021_063014_slides.pdf', options: { type: 'local', // 标记为已存在于服务器的文件,无需上传 file: { name: '06-30-2021_063014_slides.pdf', size: 替换为对应文件的实际大小(单位字节), type: 'application/pdf' } } }, { source: 'assets/uploads/files/06-29-2021_043536_slides.pdf', options: { type: 'local', file: { name: '06-29-2021_043536_slides.pdf', size: 替换为对应文件的实际大小(单位字节), type: 'application/pdf' } } } ]);
表单提交时直接提交source对应的文件路径即可,不需要FilePond再处理文件内容。
- 方案2:自定义FilePond加载逻辑,规避IDM拦截
配置FilePond的load请求头,添加AJAX标识,修改响应头为内联模式,降低被IDM识别为下载请求的概率:
Editpond = FilePond.create( document.querySelector('.file_attachment' + id), { allowMultiple: true, server: { load: (source, load, error) => { fetch(source, { headers: { 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/pdf' } }).then(res => { if (!res.ok) throw new Error('加载失败') return res.blob() }).then(load).catch(error) } } }); Editpond.addFiles('assets/uploads/files/06-30-2021_063014_slides.pdf','assets/uploads/files/06-29-2021_043536_slides.pdf');
- 方案3:给文件URL添加特殊查询参数
在文件URL后追加无业务含义的查询参数,破坏IDM的后缀匹配规则,例如:
Editpond.addFiles( 'assets/uploads/files/06-30-2021_063014_slides.pdf?preview=1', 'assets/uploads/files/06-29-2021_043536_slides.pdf?preview=1' );
同时在服务端配置忽略该查询参数即可,大部分版本的IDM不会拦截带未知查询参数的PDF请求。
- 方案4:引导用户配置IDM例外规则
如果是面向固定用户群体的内部系统,可以提示用户将当前站点添加到IDM的例外列表中,IDM默认支持配置指定域名不接管下载请求,不会影响站点其他功能的使用。
内容的提问来源于stack exchange,提问作者Augustus Buckman
相关产品推荐
相关产品推荐

