当前位置: 首页 > java >正文

java实现文件下载的几种方法

目录:

    • 一、以流的方式下载
    • 二、下载本地文件
    • 三、下载网络文件
    • 四、在线打开的方式
    • 五、将文件转换成base64
    • 六、将MultipartFile转换为File
    • 七、项目实战

一、以流的方式下载

public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file = new File(path);// 取得文件名。String filename = file.getName();// 取得文件的后缀名。String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();// 以流的形式下载文件。InputStream fis = new BufferedInputStream(new FileInputStream(path));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 设置response的Headerresponse.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));response.addHeader("Content-Length", "" + file.length());OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");toClient.write(buffer);toClient.flush();toClient.close();} catch (IOException ex) {ex.printStackTrace();}return response;}

二、下载本地文件

public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {// 下载本地文件String fileName = "Operator.doc".toString(); // 文件的默认保存名// 读到流中InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径// 设置输出的格式response.reset();response.setContentType("bin");response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");// 循环取出流中的数据byte[] b = new byte[100];int len;try {while ((len = inStream.read(b)) > 0)response.getOutputStream().write(b, 0, len);inStream.close();} catch (IOException e) {e.printStackTrace();}}

三、下载网络文件

public void downloadNet(HttpServletResponse response) throws MalformedURLException {// 下载网络文件int bytesum = 0;int byteread = 0;URL url = new URL("windine.blogdriver.com/logo.gif");try {URLConnection conn = url.openConnection();InputStream inStream = conn.getInputStream();FileOutputStream fs = new FileOutputStream("c:/abc.gif");byte[] buffer = new byte[1204];int length;while ((byteread = inStream.read(buffer)) != -1) {bytesum += byteread;System.out.println(bytesum);fs.write(buffer, 0, byteread);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

四、在线打开的方式

public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {File f = new File(filePath);if (!f.exists()) {response.sendError(404, "File not found!");return;}BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));byte[] buf = new byte[1024];int len = 0;response.reset(); // 非常重要if (isOnLine) { // 在线打开方式URL u = new URL("file:///" + filePath);response.setContentType(u.openConnection().getContentType());response.setHeader("Content-Disposition", "inline; filename=" + f.getName());// 文件名应该编码成UTF-8} else { // 纯下载方式response.setContentType("application/x-msdownload");response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());}OutputStream out = response.getOutputStream();while ((len = br.read(buf)) > 0)out.write(buf, 0, len);br.close();out.close();}

五、将文件转换成base64

	/*** 将文件转为base64*/public static String getBase64FromFile(File file) throws IOException {FileInputStream in = null;ByteArrayOutputStream out = null;try {in = new FileInputStream(file);out = new ByteArrayOutputStream();int read = 0;byte[] buffer = new byte[1024];while ((read = in.read(buffer, 0, 1024)) != -1) {out.write(buffer, 0, read);}return Base64.getEncoder().encodeToString(out.toByteArray());} catch (IOException e) {throw e;} finally {if (in != null) {in.close();}if (out != null){out.close();}}}

六、将MultipartFile转换为File

/*** 将MultipartFile转换为File*/public static File MultipartFileToFile(MultipartFile multiFile) throws IOException {String fileName = multiFile.getOriginalFilename();String prefix = fileName.substring(fileName.lastIndexOf("."));InputStream in = null;OutputStream out = null;try {File file = File.createTempFile(fileName, prefix);out = new FileOutputStream(file);in = multiFile.getInputStream();int read = 0;byte[] buffer = new byte[1024];while ((read = in.read(buffer, 0, 1024)) != -1) {out.write(buffer, 0, read);}return file;} catch (Exception e) {throw e;}finally {if (in != null){in.close();}if (out != null){out.close();}}}

七、项目实战

  FileInputStream fileInputStream = new FileInputStream("C:/Users/Admin/Downloads/test.docx");response.reset();response.setContentType("application/octet-stream");String resultFileName = URLEncoder.encode("test" + task_id + ".docx", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + resultFileName + ";" + "filename*=utf-8''" + resultFileName);//URLConnection conn = url.openConnection();//InputStream inStream = conn.getInputStream();// 循环取出流中的数据byte[] b = new byte[100];int len;try {while ((len = fileInputStream.read(b)) > 0)response.getOutputStream().write(b, 0, len);fileInputStream.close();} catch (IOException e) {e.printStackTrace();}response.flushBuffer();

在这里插入图片描述
在这里插入图片描述

最终成功将文件下载下来了。

http://www.xdnf.cn/news/11532.html

相关文章:

  • powerbuilder 11 C/S转B/S详细资料
  • 怎么在MVC中使用自定义Membership
  • NSS修改CODE详细操作教程(附图)及NSS软件下载—5530参考执行
  • IT知名博客推荐
  • 熬夜整理了免费的数据源网站大全,再也不愁找不到数据练手
  • 【HTML网页设计】 使用HTML做一个简单漂亮的页面(纯html代码)
  • APP 专项测试之兼容性测试_app兼容性测试(1)
  • 聊聊电源自动切换电路(常用自动切换电路总结)
  • 未接响铃1秒是什么意思_抖音平行宇宙之恋18分01秒是什么梗和意思 怎么了剧情介绍...
  • 勒索蠕虫感染 Windows XP临时防范补丁KB4012598安装
  • Linux--管道(pipe)
  • 如何防御流量攻击
  • 华创e路航固件_华创e路航地图官方版
  • 超详细实用ExpandableListView教程(有图有真相)
  • ctf.show的SQL注入(web171-web253)
  • linux下boot文件是什么文件,Boot.ini是什么文件?Boot.ini文件在哪里
  • 【其它】Nook HD刷机
  • jdk1.5、6、7、8、9、10、11、12等windows、linux各个版本下载
  • 当编程语言都变成女孩子
  • Windows Live Writer离线博客工具使用教程(适用于博客园、CSDN、51CTO等等博客)
  • 解读名表二级市场遭遇遇冷的“真相”,凛冬将至!
  • 程序员入门篇(非常详细)零基础入门到精通,收藏这一篇就够了
  • superset 连接时遇到的坑
  • Core文件作用、设置及用法
  • 阿里制造:“犸良”一站式动效制作平台
  • 著名的 P=NP 问题到底是什么?
  • 【Java.Web】JSP —— 语法基础 —— 包含include
  • 如何制作个人网站(如何搭建个人博客)
  • python汇率编程_利用Python中的Xpath实现一个在线汇率转换器
  • 城市轨道交通信号系统学习笔记1--ATC系统概述