Java文件上传与文件下载实现方法详解

作者:changuncle 时间:2023-11-20 12:28:45 

本文实例讲述了Java文件上传与文件下载实现方法。分享给大家供大家参考,具体如下:

Java文件上传

数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。

1、上传表单要求

  • 文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表示encodingType,及编码类型

  • 由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在URL地址栏内。也就是说,想要上传文件必须提交POST请求。

  • 表单中要有<input type="file" />标签

  • 注意:multipart/form-data请求与普通请求不同

2、下载文件上传jar包并查看官方文档

打开Apache官网http://www.apache.org/,选择APACHE PROJECT LIST中的Commons

Java文件上传与文件下载实现方法详解

选择Commons中的FileUpload项目,并下载jar包和源文件

Java文件上传与文件下载实现方法详解

Java文件上传与文件下载实现方法详解

查看FileUpload的工作方式

Java文件上传与文件下载实现方法详解

查看FileUpload项目的API

Java文件上传与文件下载实现方法详解

3、使用第三方jar包上传文件


public class RegisterServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 public RegisterServlet() {
   super();
 }
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   response.getWriter().append("Served at: ").append(request.getContextPath());
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   //第一步、判断请求是否为multipart请求
   if(!ServletFileUpload.isMultipartContent(request)) {
     throw new RuntimeException("当前请求只支持文件上传");
   }
   try {
     //第二步、创建FileItem工厂
     DiskFileItemFactory factory = new DiskFileItemFactory();
     //设置临时文件存储目录
     String path = this.getServletContext().getRealPath("/Temp");
     File temp = new File(path);
     factory.setRepository(temp);
     //单位:字节。本例设置边界值为2MB,超过该值会创建临时文件
     factory.setSizeThreshold(1024*1024*2);
     //第三步、创建文件上传核心组件
     ServletFileUpload upload = new ServletFileUpload(factory);
     //设置item的头部字符编码,解决中文乱码问题
     upload.setHeaderEncoding("utf-8");
     //设置单个上传文件的最大值为5MB
     upload.setFileSizeMax(1024*1024*5);
     //设置一次上传所有文件总和的最大值为10MB(上传多个文件时起作用)
     upload.setFileSizeMax(1024*1024*10);
     //第四步、解析请求获取所有的item
     List<FileItem> items = upload.parseRequest(request);
     //第五步、遍历item
     for(FileItem item:items) {
       if (item.isFormField()) {
           processFormField(item);
         } else {
           processUploadedFile(item);
         }
     }
   } catch (FileUploadException e) {
     e.printStackTrace();
   }
 }
 private void processFormField(FileItem item) {
   try {
     String name = item.getFieldName();
     //解决中文乱码问题
     String value = item.getString("utf-8");
     System.out.println(name+"="+value);
   } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
   }
 }
 private void processUploadedFile(FileItem item) {
   try {
     InputStream inputStream = item.getInputStream();
     String fieldName = item.getFieldName();
     //获取上传文件原始名称
     String fileName = item.getName();
     //解决文件同名问题
     fileName = System.currentTimeMillis()+fileName;
     String contentType = item.getContentType();
     boolean isInMemory = item.isInMemory();
     long sizeInBytes = item.getSize();
     String path = this.getServletContext().getRealPath("/UploadContent");
     //Date now = new Date();
     Calendar now = Calendar.getInstance();
     //对上传的文件进行分类管理
     path += "/"+now.get(Calendar.YEAR)+"/"+(now.get(Calendar.MONTH)+1)+"/"+now.get(Calendar.DAY_OF_MONTH);
     //若目录不存在,则创建该目录
     File directory = new File(path);
     if(!directory.exists()) {
       directory.mkdirs();
     }
     File descFile = new File(path,fileName);
     OutputStream outputStream = new FileOutputStream(descFile);
     int length = -1;
     byte[] buffer = new byte[1024];
     while((length=inputStream.read(buffer))!=-1) {
       outputStream.write(buffer, 0, length);
     }
     outputStream.close();
     inputStream.close();
     //删除临时文件
     item.delete();
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
}

Java文件下载

数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。

1、超链接下载

  • 浏览器能解析的文件会直接显示,如:pdf、jpg......

  • 浏览器解析不了的文件会被另存为,如:rar、exe......

  • 浏览器版本不一样,对文件的解析能力也不同

  • 缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关

2、Servlet方式下载

  • 设置响应头部属性content-disposition值为attachment

  • 获取连接服务器源文件的输入流

  • 获取输出流

  • 将输入流中的数据写到输出流中


public class DownloadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 public DownloadServlet() {
   super();
 }
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   //设置响应的头部属性content-disposition值为attachment
   //使用filename来指定文件名
   String filename = "超跑.png";
   byte[] bytes = filename.getBytes("utf-8");
   //http协议规定浏览器只能接受ISO8859-1类型的字节数据
   filename = new String(bytes,"ISO8859-1");
   response.setHeader("content-disposition", "attachment;filename="+filename);
   //获取连接服务器资源文件的输入流
   InputStream is = request.getServletContext().getResourceAsStream("/Resources/BS架构原理图1.png");
   //获取输出流
   ServletOutputStream os = response.getOutputStream();
   //将输入流中的数据写到输出流中
   int length = -1;
   byte[] buffer = new byte[1024];
   while((length=is.read(buffer))!=-1) {
     os.write(buffer,0,length);
   }
   os.close();
   is.close();
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   doGet(request, response);
 }
}

希望本文所述对大家java程序设计有所帮助。

来源:https://blog.csdn.net/xiaouncle/article/details/80379322

标签:Java,文件上传,文件下载
0
投稿

猜你喜欢

  • Android进度条ProgressBar的实现代码

    2023-01-30 07:12:22
  • 使用Java实现qq邮箱发送邮件

    2023-10-14 18:24:36
  • SpringCloud Feign 服务调用的实现

    2023-09-18 11:07:35
  • Javaweb 鼠标移入移出表格颜色变化的实现

    2021-08-31 00:03:08
  • Spring @Retryable注解轻松搞定循环重试功能

    2022-12-17 06:07:51
  • 关于C#结构体 你需要知道的

    2022-01-04 13:11:49
  • 基于jstl 标签的使用介绍

    2021-10-01 13:48:36
  • Mybatis的mapper.xml中if标签test判断的用法说明

    2023-12-23 23:04:16
  • Java NegativeArraySizeException异常解决方案

    2023-10-31 07:16:51
  • 深入学习Java编程中的字符串的进阶使用

    2023-11-11 12:54:20
  • Android SQLite数据库版本升级的管理实现

    2023-11-09 23:58:44
  • 老生常谈Scanner的基本用法

    2021-08-27 00:34:18
  • Commons beanutils组件简介

    2023-11-28 07:13:27
  • 一文带你搞懂Java定时器Timer的使用

    2022-09-08 01:18:16
  • java 如何给对象中的包装类设置默认值

    2022-02-09 21:04:08
  • Android App开发中HTTP扩展包OkHttp的入门使用指南

    2023-10-01 11:11:28
  • Android项目实现视频播放器

    2022-10-05 07:53:35
  • Java BoxLayout(盒子布局)布局管理器解析

    2022-07-19 05:26:09
  • Android仿ios年龄、生日、性别滚轮效果

    2022-02-22 11:59:03
  • Android Button 自带阴影效果另一种解决办法

    2021-06-07 04:23:02
  • asp之家 软件编程 m.aspxhome.com