js 下载文件(xls,pdf,xlsx,zip)

这段代码展示了如何使用axios从服务器获取文件流并下载不同类型的文件,包括xls, pdf, xlsx和zip。它创建了一个Blob对象,设置了正确的MIME类型,并利用隐藏的a标签实现文件下载。download函数使用axios进行异步请求,返回文件流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件流下载文件(xls,pdf,xlsx,zip)

/**
 * @param {*} res 数据 二进制流
 * @param {*} fileName 文件名
 */
export const exportFile = (res, fileName = 'fileData', fileType = 'xlsx') => {
    let url = ''
    let blobTypeParams = {}
    if (fileType === 'xls') {
        blobTypeParams = {
            type: "application/vnd.ms-excel"
        }
    }
    if (fileType === 'pdf') {
        blobTypeParams = {
            type: "application/pdf"
        }
    }
    if (fileType === 'xlsx') {
        blobTypeParams = {
            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        }
    }
    if (fileType === 'zip') {
        blobTypeParams = {
            type: "application/zip"
        }
    }
    url = window.URL.createObjectURL(new Blob([res]), blobTypeParams)
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url
    link.setAttribute('download', `${fileName}.${fileType}`)
    document.body.appendChild(link)
    link.click()
}

axios下载文件流

responseType 默认blob  ,arrayBuffer

export const download = async (url, data, method = 'post', responseType = 'blob') => {
    const res = await axios({ method, url, data, responseType })
    return Promise.resolve(res.data)
}

<think>好的,我现在需要帮助用户找到用HTML实现点击按钮下载多种格式附件的方法。用户提到的格式包括xlsxlsx、doc、docx、rar、zip、7z、pdf、pptx、jpg、png、jpeg等。首先,我应该回忆一下HTML中实现文件下载的基本方法。 通常,HTML中可以通过`<a>`标签的`download`属性来实现文件下载。这个属性会强制浏览器下载链接的资源,而不是导航到它。但需要注意,这种方法在同源策略下有效,如果文件在不同域可能需要服务器设置CORS。另外,对于动态生成的内容或者需要触发下载动作的按钮,可能需要结合JavaScript来处理。 接下来,我需要考虑不同文件类型的处理方式。比如图片文件(jpg、png、jpeg),默认情况下,浏览器可能会直接打开而不是下载。使用`download`属性可以覆盖这个行为。对于文档类文件如doc、xlsx等,同样适用。不过,有些浏览器可能不支持某些MIME类型的自动下载,这时候可能需要服务器正确设置Content-Type头。 用户可能需要一个代码示例,展示如何为不同文件类型创建下载按钮。我可以给出一个基本的HTML结构,使用多个`<a>`标签,每个标签对应不同的文件类型,并添加`download`属性。同时,可能需要说明如何处理动态文件名称或服务器端路径的问题。 另外,考虑到用户提到的多种格式,可能需要检查某些格式的特殊情况。例如,rar和7z是压缩文件,它们的MIME类型可能需要正确设置。常见的MIME类型如application/zip用于zip,application/x-rar-compressed用于rar,application/x-7z-compressed用于7z等。确保服务器正确配置这些MIME类型可以避免下载时出现问题。 还有,如果用户需要在一个按钮触发多个文件下载,这可能需要使用JavaScript,因为浏览器通常不允许同时下载多个文件。但一般来说,每个文件需要一个独立的链接或按钮。或者使用JavaScript动态创建多个隐藏的`<a>`标签并模拟点击。 此外,对于动态生成的文件内容,比如前端生成的表格导出为xls,可能需要使用Blob对象和URL.createObjectURL方法来实现下载。这部分可能需要结合JavaScript代码示例。 还需要考虑浏览器兼容性问题。`download`属性在部分旧浏览器中可能不被支持,特别是IE。这时候可能需要后端配合,通过设置Content-Disposition头部为attachment来强制下载。 总结一下,回答应该包括以下几点: 1. 使用`<a>`标签和`download`属性的基本方法。 2. 不同文件类型的MIME类型注意事项。 3. JavaScript动态生成下载链接的方法。 4. 服务器端配置的重要性,如CORS和Content-Disposition。 5. 浏览器兼容性问题及解决方案。 然后,我需要组织这些内容,提供清晰的代码示例,并解释每个部分的作用。同时,引用用户提供的参考资料,特别是关于Java后端处理文件预览的部分,可能可以提到如何与后端配合实现更稳定的下载功能,比如引用中的kkFileView项目,虽然主要关于预览,但下载功能也可能涉及类似的后端处理。</think>以下是使用HTML实现多格式文件下载的代码示例及实现方法: ### 一、基础实现方法 ```html <!-- 单个文件直接下载 --> <a href="/files/report.pdf" download="年度报告.pdf"> <button>下载PDF报告</button> </a> <!-- 多文件类型示例 --> <div class="download-buttons"> <a href="/files/data.xlsx" download="数据报表.xlsx"> <button>下载Excel文件</button> </a> <a href="/files/image.jpg" download="示例图片.jpg"> <button>下载JPG图片</button> </a> <a href="/files/archive.zip" download="压缩包.zip"> <button>下载ZIP文件</button> </a> </div> ``` ### 二、关键技术要点 1. **download属性**:强制触发文件下载行为 - 支持自定义下载文件名:`download="自定义文件.ext"` - 同源策略限制:跨域文件可能无法正确触发下载[^1] 2. **MIME类型配置**(服务器端示例): ```properties # 添加至服务器mime.types配置 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx application/vnd.ms-excel xls application/msword doc application/vnd.openxmlformats-officedocument.wordprocessingml.document docx application/x-rar-compressed rar application/x-7z-compressed 7z ``` 3. **JavaScript动态下载**: ```javascript function downloadFile(url, filename) { const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); } // 调用示例 downloadFile('/files/presentation.pptx', '演示文稿.pptx'); ``` ### 三、增强实现方案 1. **批量下载实现**: ```html <script> function batchDownload() { const files = [ {url: '/files/doc1.docx', name: '文档1.docx'}, {url: '/files/img2.png', name: '图片2.png'} ]; files.forEach(file => { const link = document.createElement('a'); link.href = file.url; link.download = file.name; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }); } </script> <button onclick="batchDownload()">批量下载文件</button> ``` 2. **浏览器兼容方案**: ```javascript function safeDownload(url, filename) { if(!!document.createElement('a').download) { // 支持download属性的现代浏览器 const link = document.createElement('a'); link.download = filename; link.href = url; link.click(); } else { // 兼容旧版浏览器 window.open(url + '?response-content-type=application/octet-stream'); } } ``` ### 四、注意事项 1. 服务器应正确设置`Content-Disposition`响应头: ``` Content-Disposition: attachment; filename="filename.ext" ``` 2.文件建议采用分块传输编码(chunked transfer encoding) 3. 敏感文件应实施权限验证机制[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值