通过文件url,实现文件下载

通过url实现文件下载

@Log("下载文件")
@ResponseBody
@RequestMapping(value = "/download", method = RequestMethod.GET)
public R Download(HttpServletResponse response,Long id) {
    String fileUrl = fileService.get(id).getUrl();//文件url
    String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1);//文件名字

    response.setHeader("content-type", "application/octet-stream");
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

    byte[] buff = new byte[1024];
    BufferedInputStream bis = null;
    OutputStream os = null;

    try {
        os = response.getOutputStream();
        bis = new BufferedInputStream(new URL(fileUrl).openConnection().getInputStream());
        int i = bis.read(buff);
        while (i != -1) {
            os.write(buff, 0, buff.length);
            os.flush();
            i = bis.read(buff);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bis != null) {
            try {
                bis.close();
                return R.ok();
            } catch (IOException e) {
                e.printStackTrace();
                return R.error();
            }
        }
    }
    return null;
}
经测试,上面的方式,文件下载缺失严重,下面的下载方式没有问题。

@Log("下载文件")
@ResponseBody
@RequestMapping(value = "/download", method = RequestMethod.GET)
public R download(HttpServletRequest request,HttpServletResponse response,Long id) throws ServletException, IOException{
    request.setCharacterEncoding("UTF-8");
    String fileUrl = fileService.get(id).getUrl();//文件url
    String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);//获取要下载的文件名
    //设置响应类型
    fileName = URLEncoder.encode(fileName,"UTF-8");
    response.setHeader("Content-Disposition","attachment;filename=" + fileName);
    response.setContentType("application/force-download");//应用程序强制下载
    //读取文件
    OutputStream out = response.getOutputStream();
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(fileUrl);
    CloseableHttpResponse httpResp = httpclient.execute(httpGet);
    try{
        HttpEntity httpEntity = httpResp.getEntity();
        response.setContentLength((int) httpEntity.getContentLength());
        IOUtils.copy(httpEntity.getContent(),out);
        return R.ok();
    }catch(Exception ex){
        httpclient.close();
        ex.printStackTrace();
        return R.error();
    }finally{
        out.flush();
        out.close();
    }
}

R工具类:

import java.util.HashMap;
import java.util.Map;
public class R extends HashMap<String, Object> {
   private static final long serialVersionUID = 1L;

   public R() {
      put("code", 0);
      put("msg", "操作成功");
   }

   public static R error() {
      return error(1, "操作失败");
   }

   public static R error(String msg) {
      return error(500, msg);
   }

   public static R error(int code, String msg) {
      R r = new R();
      r.put("code", code);
      r.put("msg", msg);
      return r;
   }

   public static R ok(String msg) {
      R r = new R();
      r.put("msg", msg);
      return r;
   }

   public static R ok(Map<String, Object> map) {
      R r = new R();
      r.putAll(map);
      return r;
   }

   public static R ok() {
      return new R();
   }

   @Override
   public R put(String key, Object value) {
      super.put(key, value);
      return this;
   }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值