springBoot+vue项目使用js实现文件下载,下载完成打开文件提示错误

代码逻辑:前台使用axios传递url到后台,后台根据url获取file对象,传递文件流到前台,前台生成a链接下载文件

代码:

(axions方法)

//传递url参数后台通过参数获取文件流的方法
export const downloadFile = (data) => {
  return axios.request({
    url: 'v1/alm/businessDeclarationManagement/downloadFile',
    method: 'post',
    data: data
  })
}

js下载事件:

handlePreview(file){
  const url = file.url;
  if (url !== '' && url !== undefined) {
    var reg = /([^\\/]+)\.([^\\/]+)/i;
    reg.test(url);
    const pre = RegExp.$1
    const sux = RegExp.$2
    downloadFile(url).then(
      res => {
        // alert("请求成功");
        let blob = new Blob([res.data])
        let downloadElement = document.createElement('a')
        // 创建下载的链接
        let href = window.URL.createObjectURL(blob)
        downloadElement.style.display = 'none'
        downloadElement.href = href
        // 下载后文件名
        downloadElement.download = pre + '.' + sux
        document.body.appendChild(downloadElement)
        // 点击下载
        downloadElement.click()
        // 下载完成移除元素
        document.body.removeChild(downloadElement)
        // 释放掉blob对象
        window.URL.revokeObjectURL(href)
        this.$message.success("下载成功")
      })
  }

后端代码:

//下载附件
    @PostMapping("downloadFile")
    public void downloadFiles(@RequestBody String downUrl, HttpServletRequest request, HttpServletResponse response) throws IOException {
        OutputStream outputStream=null;
        InputStream inputStream=null;
        BufferedInputStream bufferedInputStream=null;
        byte[] bytes=new byte[1024];
        File file = new File(downUrl);
        String fileName = file.getName();
        // 获取输出流
        try {
            // StandardCharsets.ISO_8859_1 *=UTF-8'
            // response.setHeader("Content-Disposition", "attachment;filename=" +  new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            response.setHeader("Content-Disposition", "attachment;filename=" +  URLEncoder.encode(fileName, "UTF-8"));
            // 以流的形式返回文件
            response.setContentType("application/octet-stream;charset=utf-8");
            inputStream = new FileInputStream(file);
            bufferedInputStream = new BufferedInputStream(inputStream);
            outputStream = response.getOutputStream();
            int i = bufferedInputStream.read(bytes);
            while (i!=-1){
                outputStream.write(bytes,0,i);
                i = bufferedInputStream.read(bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这样的话,按正常来说已经是可以实现文件下载的功能了,但是我后面上传文件时(excel文件)出现了一下的错误情况

 

 这是因为缺少 responseType: 'blob'属性

修改(axios代码):

export const downloadFile = (data) => {
  return axios.request({
    url: 'v1/alm/businessDeclarationManagement/downloadFile',
    responseType: 'blob',
    method: 'post',
    data: data
  })
}

 修改js代码:

let blob = new Blob([res.data])

修改为:

let blob = new Blob([res.data],{
              type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
            })

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 后端实现文件下载 在Spring Boot中,我们可以使用以下代码实现文件下载: ```java @GetMapping("/download") public ResponseEntity<Resource> downloadFile() throws IOException { Resource resource = new UrlResource("file:/path/to/file"); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\""); return ResponseEntity.ok().headers(headers).contentLength(resource.contentLength()).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource); } ``` 其中,`UrlResource`是Spring提供的获取文件资源的类,`HttpHeaders.CONTENT_DISPOSITION`设置文件下载方式为附件,`MediaType.APPLICATION_OCTET_STREAM`指定文件类型为二进制流。 2. 前端实现文件下载Vue中,我们可以使用Element UI中的`el-button`组件来实现文件下载: ```html <el-button type="primary" icon="el-icon-download" @click="downloadFile">下载文件</el-button> ``` 在Vue组件中,我们需要定义`downloadFile`方法来实现文件下载: ```javascript downloadFile() { window.location.href = '/download'; } ``` 其中,`window.location.href`将页面重定向到下载链接,即后端实现文件下载接口。 需要注意的是,如果需要传递参数给后端,可以使用axios或者fetch来发送GET或POST请求,将参数传递给后端,再在后端实现文件下载。具体实现方法可以参考以下代码: ```javascript downloadFile() { axios.get('/download', { params: { filename: 'example.txt' }, responseType: 'blob' }).then(response => { const blob = new Blob([response.data], {type: 'application/octet-stream'}) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = 'example.txt' link.click() window.URL.revokeObjectURL(url) }) } ``` 在这个例子中,我们使用了axios来发送GET请求,`params`中传递了参数filename,`responseType`设置返回类型为二进制流。在请求成功后,我们将返回的数据转换为Blob对象,通过URL.createObjectURL方法生成下载链接,然后创建一个a标签并设置download属性,模拟点击a标签来下载文件。最后使用URL.revokeObjectURL方法释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值