文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Java项目中使用fileupload组件如何实现一个文件上传功能

2023-05-31 14:41

关注

本篇文章给大家分享的是有关在Java项目中使用fileupload组件如何实现一个文件上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

使用fileupload组件的原因:

Request对象提供了一个getInputStream()方法,通过这个方法可以读取到客户端提交过来的数据,但是由于用户可能会同时上传多个文件,在servlet中编程解析这些上传数据是一件非常麻烦的工作。为方便开发人员处理文件上传数据,Apache开源组织提供了一个用来处理表单文件上传的一个开源组件(Commons-fileupload),该组件性能优异,并且使用及其简单,可以让开发人员轻松实现web文件上传功能。

使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:

commons-fileupload和connons-io(commons-upload组件从1.1版本开始,它的工作需要commons-io包的支持)

FileUpload组件工作流程:

在Java项目中使用fileupload组件如何实现一个文件上传功能

相应的代码框架为:

package pers.msidolphin.uploadservlet.web;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L;  public UploadServlet() {  super(); }  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  //获取解析工厂  DiskFileItemFactory factory = new DiskFileItemFactory();  //得到解析器  ServletFileUpload parser = new ServletFileUpload(factory);  //解决文件名乱码问题  parser.setHeaderEncoding("UTF-8");  //判断上传表单类型  if(!ServletFileUpload.isMultipartContent(request)) {   return;  }  try {   //调用解析器解析上传数据   List<FileItem> fileItems = parser.parseRequest(request);   //获得保存上传文件目录的路径   String uploadPath = request.getServletContext().getRealPath("/WEB-INF/upload");   //遍历List集合   for (FileItem fileItem : fileItems) {    //判断是否为普通表单字段    if(fileItem.isFormField()) {     //如果是普通表单字段则打印到控制台     if(fileItem.getString() == null || "".equals(fileItem.getString().trim())) {      continue;     }     System.out.println(fileItem.getFieldName() + " = " + new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8"));    }else {     //获得文件路径     String filePath = fileItem.getName();     //如果并未上传文件,继续处理下一个字段     if(filePath == null || "".equals(filePath.trim())) {      continue;     }     System.out.println("处理文件:" + filePath);     //截取文件名     String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);     String reallyName = this.createFileName(fileName);     String reallyPath = this.mkDir(reallyName, uploadPath);     //下面都是普通的IO操作了     InputStream in = fileItem.getInputStream();     FileOutputStream out = new FileOutputStream(reallyPath + "\\" + reallyName);     byte[] buffer = new byte[1024];     int len = 0;     while((len = in.read(buffer)) > 0) {      out.write(buffer, 0, len);     }     out.close();     in.close();    }   }   System.out.println("处理完毕...");  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  doGet(request, response); } //随机产生唯一的文件名 private String createFileName(String fileName) throws NoSuchAlgorithmException, UnsupportedEncodingException {  String extension = fileName.substring(fileName.lastIndexOf("."));  MessageDigest md = MessageDigest.getInstance("md5");  String currentTime = System.currentTimeMillis() + "";  return UUID.randomUUID() + currentTime + extension; } //根据哈希值产生目录 private String mkDir(String fileName, String uploadPath) {  int hasCode = fileName.hashCode();  //低四位作为一级目录  int parentDir = hasCode & 0xf;  //二级目录  int childDir = hasCode & 0xff >> 2;  File file = new File(uploadPath + "\\" + parentDir + "\\" + childDir);  if(!file.exists()) {   file.mkdirs();  }  uploadPath = uploadPath + "\\" + parentDir + "\\" + childDir;  return uploadPath; }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯