fastdfs下载到浏览器需要再重命名的问题

fastdfs上传后,文件名会进行更改,变成乱码。并不能是原名。
本来浏览器直接a标签绑url(ip+path),就能下载下来文件,但是文件名字嫌难看。

上传的文件有各种格式:zip,pdf,doc,jpg…

看了一下项目里已有的FileClientUtils等方法,并不带可以重命名的入参。只能自己写了

本想java io流里读取远程文件,response里setContentType,文件格式太多了,太蛋疼了,吐了。而且弄完了,前端点下载屁反应没有,不懂。遂,换思路,不在java里变成原格式了。

目前处理:

上传fastdfs时,返回rul和原名,存表。
java只是读取文件,返回二进制。
二进制重新转换为doc还是pdf等等,由前端处理(重命名为带格式后缀的原名即可,这也太简单了)
后端:

 @SysLog("下载")
    @RequestMapping("/download")
    public ResponseEntity<byte[]> downloadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam Map<String, Object> params) throws Exception {
        String id = (String) params.get("id");
        OaInformFileEntity oaInformFile = oaInformFileService.selectById(id);
        String fileName = oaInformFile.getInformFileName();
        String fileUrl = oaInformFile.getInformFileUrl();

//        if (!StringUtils.isEmpty(id)) {

            String url = fileUrl;
            HttpHeaders headers = new HttpHeaders();

            //处理IE
            String userAgent = request.getHeader("user-agent").toLowerCase();

            if (userAgent.contains("msie") || userAgent.contains("like gecko")  ||
                    userAgent.contains("Trident")) {
                // win10 ie edge 浏览器 和其他系统的ie
                // 可以不用在这里管文件名。懒得删了
                fileName = URLEncoder.encode(fileName, "UTF-8");
                //解决下载时,空格变加号
                fileName = org.apache.commons.lang3.StringUtils.replace(fileName, "+", "%20");
            } else {
                // fe
                fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");

                //解决下载时,空格变加号
                fileName = org.apache.commons.lang3.StringUtils.replace(fileName, "+", "%20");
            }

            //通知浏览器以attachment(下载方式)
            headers.setContentDispositionFormData("attachment",fileName); //解决原始文件名中有中文出现乱码);
            //application/octet-stream : 二进制流数据。后端不用再管pdf还是doc了,太爽了
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            return new ResponseEntity<byte[]>(IOUtils.toByteArray(getFileInputStream(url)),
                    headers, HttpStatus.CREATED);

    }


   public InputStream getFileInputStream(String urlString) {
        InputStream is = null;
        try {
            // 构造URL
            URL url = new URL(urlString);
            // 打开连接
            URLConnection con = url.openConnection();
            // 输入流
            is = con.getInputStream();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return is;
    }

前端:

 download(row) {
      this.$http({
        url: this.$http.adornUrl('/o/i/download'),
        method: 'get',
        responseType: 'blob',
        params: { id: row.id}
      }).then(({ data }) => {
        const url = window.URL.createObjectURL(data);
        const a = document.createElement('a');
        a.href = url;
        // 带文件名的重命名,即可。如'爱党爱国.doc'
        a.download = row.fileName;
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
      })
    },
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值