文件下载的两种实现(vue和springboot的前后端)

  1. 前提:整一下文件下载,之前的文件下载不是通过字符串的形式返回给前端的,而是直接放在响应中让浏览器来处理,前端不处理,但是存在很多前端问题所以就没法弄了。所以就换成字符流的形式了,虽然做完了但是还是有点不太懂交互所以呢就整一下这个,话不多说开弄。
  2. 方式a:最常见的base64的字符串流,前端的话需要调用atob方法即可。
 File url1 = new File(url);
        String name = url1.getName();
        int i = name.lastIndexOf(".");
        String fileType = name.substring(i + 1);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", name);
        jsonObject.put("fileType", fileType);
        InputStream in = null;
        try {
            in = new FileInputStream(url);
            byte[] data = new byte[in.available()];
            in.read(data);
            in.close();
            jsonObject.put("file", new BASE64Encoder().encode(data));

        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonUtils.succssonJson(jsonObject);

或者

 File url1 = new File(url);
        String name = url1.getName();
        int i = name.lastIndexOf(".");
        String fileType = name.substring(i + 1);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", name);
        jsonObject.put("fileType", fileType);
        InputStream in = null;

        try {
            byte[] data = FileUtils.readFileToByteArray(url1);
            jsonObject.put("file",Base64Utils.encodeToString(data));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return CommonUtils.succssonJson(jsonObject);

对应前端需要atob来处理

 downloadFile(bstr , fileName,type) {
		 var res= window.atob(bstr)
        let n=res.length
        let u8arr = new Uint8Array(n)
        while(n--){
        u8arr[n]=res.charCodeAt(n)
       }
       let blob=new Blob([u8arr],{type:type})
      if(window.navigator && window.navigator.msSaveOrOpenBlob){
        window.navigator.msSaveOrOpenBlob(blob,fileName)
      }else{
         var link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
                window.URL.revokeObjectURL(link.href)
            }
      }

方式b:char的流前端直接用即可,相当于生成atob之后字符串

  File url1 = new File(url);
        String name = url1.getName();
        int i = name.lastIndexOf(".");
        String fileType = name.substring(i + 1);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", name);
        jsonObject.put("fileType", fileType);
        InputStream in = null;
        try {

            byte[] data = FileUtils.readFileToByteArray(url1);
            StringBuffer stringBuffer = new StringBuffer();
            for (int j = 0; j <data.length ; j++) {
                stringBuffer.append((char)data[j]);
            }
            jsonObject.put("file",new String(stringBuffer));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonUtils.succssonJson(jsonObject);

对应的前端实现

 downloadFile(res, fileName,type) {
        let n=res.length
        let u8arr = new Uint8Array(n)
        while(n--){
        u8arr[n]=res.charCodeAt(n)
       }
       let blob=new Blob([u8arr],{type:type})
      if(window.navigator && window.navigator.msSaveOrOpenBlob){
        window.navigator.msSaveOrOpenBlob(blob,fileName)
      }else{
         var link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
                window.URL.revokeObjectURL(link.href)
            }
      }

经过测试两种方法均可处理,base64安全但多了一步操作。自己斟酌即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值