广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 计算机教程 > 正文

Java文件上传与文件下载

作者:adminjiang发布时间:2021-07-06分类:计算机教程浏览:787


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

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


1. 上传表单要求

文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将

标签的enctype属性值设为“multipart/form-data”,enctype表示encodingType,及编码类型

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

表单中要有标签

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

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

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


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



查看FileUpload的工作方式


查看FileUpload项目的API


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 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培训,UI设计培训,PHP培训,Web前端培训,软件开发编程培训等全程项目实战,免费就业推荐等,详情请点击右边的咨讯框咨询在线的老师,同时还可以获取免费的试听课程,欢迎咨询哦!!!



计算机教程排行
标签列表
网站分类
文章归档
最近发表