21xrx.com
2024-11-22 10:04:06 Friday
登录
文章检索 我的文章 写文章
「教程」Java文件上传的几种方式,向你详细介绍
2023-06-12 11:23:58 深夜i     --     --
Java 文件上传 Servlet Commons

文件上传在网络开发中属于一个基础而又必要的功能,而Java作为一种广泛应用于网络开发的编程语言,也自然要学习它的文件上传方式。本文将向你介绍Java文件上传的几种方式。

一、使用Servlet实现文件上传

使用Servlet实现文件上传需要先了解HTTP协议中关于文件上传的几个标准头信息,例如Content-Type、Content-Disposition以及Content-Length等。Servlet通过对收到的请求进行解析,获取到HTTP协议中的几个标准头信息,并进而获取到文件的相关信息,最终完成文件的上传。

以下是使用Servlet实现文件上传的代码示例:


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

  File file = new File(savePath);

  if (!file.exists() && !file.isDirectory()) {

    System.out.println("目录或文件不存在!");

    file.mkdir();

  }

  DiskFileItemFactory factory = new DiskFileItemFactory();

  ServletFileUpload upload = new ServletFileUpload(factory);

  upload.setHeaderEncoding("UTF-8");

  if (!ServletFileUpload.isMultipartContent(request))

    return;

  

  List itemList = null;

  try {

    itemList = upload.parseRequest(request);

  } catch (FileUploadException e) {

    e.printStackTrace();

  }

  for (FileItem item : itemList) {

    if (item.isFormField()) {

      String name = item.getFieldName();

      String value = item.getString("UTF-8");

      System.out.println(name + " = " + value);

    } else {

      String fileName = item.getName();

      if (fileName == null || fileName.trim().equals(""))

        continue;

      

      fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);

      InputStream inputStream = item.getInputStream();

      FileOutputStream outputStream = new FileOutputStream(savePath + "\\" + fileName);

      byte[] buffer = new byte[1024];

      int len = 0;

      while ((len = inputStream.read(buffer)) > 0) {

        outputStream.write(buffer, 0, len);

      }

      inputStream.close();

      outputStream.close();

      item.delete();

      System.out.println("文件上传成功!");

    }

  }

}

二、使用Commons FileUpload实现文件上传

Commons FileUpload是Apache基金会下的一个用于文件上传的开源项目,其在文件上传中优化了很多细节,并提供了许多方便的API,可以让Java文件上传变得更加简单方便。

以下是使用Commons FileUpload实现文件上传的代码示例:


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

  File file = new File(savePath);

  if (!file.exists() && !file.isDirectory()) {

    System.out.println("目录或文件不存在!");

    file.mkdir();

  }

  DiskFileItemFactory factory = new DiskFileItemFactory();

  ServletFileUpload upload = new ServletFileUpload(factory);

  upload.setHeaderEncoding("UTF-8");

  if (!ServletFileUpload.isMultipartContent(request))

    return;

  

  List itemList = null;

  try {

    itemList = upload.parseRequest(request);

  } catch (FileUploadException e) {

    e.printStackTrace();

  }

  for (FileItem item : itemList) {

    if (item.isFormField()) {

      String name = item.getFieldName();

      String value = item.getString("UTF-8");

      System.out.println(name + " = " + value);

    } else {

      String fileName = item.getName();

      if (fileName == null || fileName.trim().equals(""))

        continue;

      

      fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);

      InputStream inputStream = item.getInputStream();

      FileOutputStream outputStream = new FileOutputStream(savePath + "\\" + fileName);

      byte[] buffer = new byte[1024];

      int len = 0;

      while ((len = inputStream.read(buffer)) > 0) {

        outputStream.write(buffer, 0, len);

      }

      inputStream.close();

      outputStream.close();

      item.delete();

      System.out.println("文件上传成功!");

    }

  }

}

三、使用Spring MVC实现文件上传

Spring MVC是Spring Framework中的Web开发框架,相比于Servlet和Commons FileUpload方式,它最大的优势是缩短了我们编写的代码量,极大地提高了开发效率。

以下是使用Spring MVC实现文件上传的代码示例:


@RequestMapping(value = "/upload", method = RequestMethod.POST)

@ResponseBody

public Map uploadFile(@RequestParam(value = "file") MultipartFile file) {

  Map map = new HashMap<>();

  String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");

  File targetFile = new File(savePath);

  if (!targetFile.exists() && !targetFile.isDirectory()) {

    System.out.println("目录或文件不存在!");

    targetFile.mkdir();

  }

  if (file.isEmpty()) {

    map.put("result", "ERROR");

    map.put("message", "文件为空!");

    return map;

  }

  String fileName = file.getOriginalFilename();

  String suffixName = fileName.substring(fileName.lastIndexOf("."));

  fileName = UUID.randomUUID() + suffixName;

  File destFile = new File(savePath + "\\" + fileName);

  try {

    file.transferTo(destFile);

    map.put("result", "SUCCESS");

    map.put("message", "文件上传成功!");

  } catch (IOException e) {

    e.printStackTrace();

    map.put("result", "ERROR");

    map.put("message", "文件上传失败!");

  }

  return map;

}

FileUpload、Spring MVC

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复