如何通过JavaScript获取Action方法返回的待下载文件并转为Blob
可以通过JavaScript实现将转换后的文件作为Blob处理
当然可以,你需要调整请求方式,避免直接触发浏览器下载,而是通过AJAX获取Blob格式的响应,以下是具体实现方案:
问题分析
你当前的表单提交会直接触发浏览器下载,而现有JS代码存在核心问题:
- 用
JSON.stringify()处理multipart/form-data格式的数据是错误的,这类数据需要用FormData对象构建 - jQuery AJAX默认会自动处理数据,需禁用该行为并正确设置响应类型
修正后的jQuery实现代码
function convert(inputFile) { // 构建FormData对象,模拟表单提交的数据结构 const formData = new FormData(); formData.append('File', inputFile); formData.append('FileName', 'Test'); $.ajax({ url: 'https://v2.convertapi.com/convert/xls/to/xlsx?Secret=...', method: 'POST', data: formData, // *关键设置*:禁止jQuery自动处理数据和设置Content-Type processData: false, contentType: false, // *关键设置*:指定响应类型为blob,返回结果直接是Blob对象 xhrFields: { responseType: 'blob' }, success: function(blob) { // 此处拿到的blob就是转换后的XLSX文件,可按需进一步处理 console.log('获取到Blob:', blob); // 示例:生成临时下载链接(用于验证转换结果,可选) const downloadUrl = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = downloadUrl; a.download = 'converted.xlsx'; a.click(); URL.revokeObjectURL(downloadUrl); // *释放临时URL资源,避免内存泄漏* // 你可以在这里将Blob用于其他操作:比如上传到其他服务器、用第三方库解析内容等 }, error: function(err) { console.error('转换失败:', err.responseText); } }); }
原生JavaScript实现(无需jQuery)
如果不想依赖jQuery,也可以用原生Fetch API实现:
async function convert(inputFile) { const formData = new FormData(); formData.append('File', inputFile); formData.append('FileName', 'Test'); try { const response = await fetch('https://v2.convertapi.com/convert/xls/to/xlsx?Secret=...', { method: 'POST', body: formData }); if (!response.ok) { throw new Error(`请求失败:${response.statusText}`); } const blob = await response.blob(); console.log('获取到Blob:', blob); // 后续Blob处理逻辑可参考上方示例 } catch (err) { console.error('转换失败:', err); } }
关键注意事项
- 移除URL中的
download=attachment参数,该参数会强制服务器返回下载响应头,导致浏览器自动触发下载 - 确保请求URL中的
Secret参数正确,这是ConvertAPI的验证密钥 - 使用临时URL后必须调用
URL.revokeObjectURL()释放资源,避免内存占用过高
内容的提问来源于stack exchange,提问作者Umair
相关产品推荐
相关产品推荐

