Vue+SpringBoot根据url返回文件流给前端下载文件(多个图片zip下载)

后端

单个文件下载

package com.ruoyi.common;

import com.ruoyi.project.system.domain.TSystemFile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

/**
 * 下载功能
 *
 * @author DELL
 */
@RestController
@RequestMapping("/system/downLoad")
public class DownLoadFileTools {

    @GetMapping("/downLoadFile")
    public void downLoadFile(TSystemFile tSystemFile, HttpServletResponse response) throws Exception {
        long starttime = System.currentTimeMillis();
        String path = tSystemFile.getFilepath();
        String filename = tSystemFile.getFilename();
        URL url = new URL(path);
        URLConnection conn = url.openConnection();
        InputStream inputStream = conn.getInputStream();
        response.reset();
        //文件类型自动判断
        response.setContentType("multipart/form-data");
        response.setCharacterEncoding("UTF-8");
        //将Content-Disposition暴露给前端
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
        //将文件名放入header的Content-Disposition中
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));


        byte[] buffer = new byte[1024 * 1024 * 10];
        int len;

        BufferedOutputStream outputStream =new BufferedOutputStream(response.getOutputStream()) ;
        while ((len = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, len);
        }
        inputStream.close();
        outputStream.close();
        long endtime = System.currentTimeMillis();
        System.out.println("下载时间为:"+(endtime-starttime)/1000+"秒");
    }


}

多个图片zip下载

 //如果是多个文件,打成zip在下载
                String fileName="图片.zip";
                response.reset();
                //文件类型自动判断
                response.setContentType("multipart/form-data");
                response.setCharacterEncoding("UTF-8");
                //将Content-Disposition暴露给前端
                response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
                //将文件名放入header的Content-Disposition中
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

                //创建压缩流关联压缩包  ZipOutputStream类:完成文件或文件夹的压缩
                ZipOutputStream zos=new ZipOutputStream(response.getOutputStream());
                for (UpFile file:files) {
                    URL url=new URL(file.getViewpath());
                    URLConnection conn = url.openConnection();
                    InputStream inputStream=conn.getInputStream();
                    //创建ZipEntry对象,并为每个文件命名,放入压缩包当中
                    ZipEntry ze=new ZipEntry(file.getFilename());
                    zos.putNextEntry(ze);
                    byte[] buffer = new byte[1024 * 1024 * 10];
                    int len;
                    while ((len = inputStream.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                    inputStream.close();
                    zos.closeEntry();
                }
                zos.close();

前端

 <el-upload
              class="upload-demo"
              action="#"
              :on-preview="handlePreview"
              :on-remove="handleRemove"
              :before-remove="beforeRemove"
              :before-upload="beforeUpload"
              :on-success="handleSuccess"
              :file-list="fileList">
              <el-button size="small" type="primary">点击上传</el-button>
            </el-upload>  


//点击附件名称触发
  handlePreview(file) {
        console.log(file)
        var msg = {filepath: file.url, filename: file.name}
        downloadFileTools(msg).then(res=>{
      console.log(res, 'ress')
     const blob = new Blob([res.data], {type: res.data.type})
    const downloadElement = document.createElement('a')
    //  var url=window.URL || window.webkitURL || window.moxURL;
    const href = window.URL.createObjectURL(blob)
    downloadElement.href = href
    // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
    var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
    var contentDisposition = decodeURI(res.headers['content-disposition'])
    var result = patt.exec(contentDisposition)
    var fileName = result[1]
    fileName = fileName.replace(/\"/g, '')
    downloadElement.download = fileName
    downloadElement.click()

        })
      },
export function downloadFileTools(query) {
  return request({
    url:'/system/downLoad/downLoadFile',
    method:'get',
    responseType:'blob',
    params:query
  })
}

还需要在响应拦截中添加一行判断返回整个response,不然获取不到header

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VueSpring Boot中实现文件下载的方法有多种。根据提供的引用内容,我们可以使用文件流的方式来实现。首先,在Vue前端代码中需要定义一个下载文件的方法,可以通过点击按钮触发该方法。 在Vue前端代码中,我们可以使用Element UI等前端框架来创建一个按钮,绑定一个click事件方法,例如: ```html <template> <div> <el-button size="medium" type="success" plain @click="downLoadFile">下载</el-button> </div> </template> ``` 接着,在Vue的JavaScript逻辑部分,使用axios调用后端接口来进行文件下载。具体的JavaScript代码如下所示: ```javascript export default { name: "xxx", data() { return { filePath: 'D:\file\文件名称.pdf', // 文件路径 fileName: '文件名称.pdf', // 文件名称 } }, methods: { // 下载文件方法 downLoadFile() { this.$axios.get("/downFile/downLoadFile", { params: { path: this.filePath, name: this.fileName }, responseType: 'blob' }).then(res => { const blob = new Blob([res.data]); const fileName = res.headers["content-disposition"].split(";")[1].split("filename=")[1]; if ('download' in document.createElement("a")) { const link = document.createElement("a"); link.download = fileName; link.style.display = 'none'; link.href = URL.createObjectURL(blob); document.body.appendChild(link); link.click(); URL.revokeObjectURL(link.href); document.body.removeChild(link); } else { navigator.msSaveBlob(blob, fileName); } }) } }, } ``` 在上述代码中,我们通过axios发送GET请求到后端接口`"/downFile/downLoadFile"`,并传递文件的路径和名称作为请求参数。同时,我们指定了`responseType`为`blob`,以便获取到文件的二进制数据。在获取到文件数据后,我们将其保存为Blob对象,并使用创建的下载链接进行文件下载。 请注意,以上代码仅为示例,实际的路径和文件名需要根据具体情况进行修改。此外,需要确保后端接口正确处理文件下载请求,并返回文件的二进制数据。 综上所述,以上代码演示了在VueSpring Boot中实现文件下载的方法,你可以根据需要进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *3* *4* [vue+springboot使用文件流实现文件下载](https://blog.csdn.net/xc9711/article/details/127485603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值