文件上传之Apache commons fileupload使用

本文介绍如何使用Apache Commons FileUpload组件实现文件上传功能。重点讲解了配置表单、解析请求及处理上传文件的具体步骤,并提供了前端HTML页面与Servlet端Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传的方法主要目前有两个常用的:
一个是SmartUpload;
一个是Apache的Commons fileupload。

我这里主要学习第二个的用法,首先要上传文件,注意几个问题:
  1 form表单内,要添加:<input type="file" name="myfile"> ;
  2 form表单的内容格式要定义成multipart/form-data格式,即添加属性enctype = "multipart/form-data"
  3 需要类库:commons-io.jar 和 commons-fileupload-1.3.1.jar 。

主要步骤描述:
     在webRoot下新建了upload文件夹,当部署项目后会随项目一起部署到服务器上;
     新写一个UploadServlet,上传的文件会保存到upload文件夹中,当项目从服务器上移除时,该文件夹会自动清除。


前端(upload.html)代码:
<body>
     <form action="/login/UploadServlet" method="post" enctype="multipart/form-data">
          请选择上传的图片或文件:
          <input type="file" name="good_pcl" id="good_pcl"><br/><br/>
          <input type="submit" value="上传" />
     </form>
</body>

UploadServlet.java代码:
          /*编码*/
          request.setCharacterEncoding("utf-8");
          response.setContentType("text/html;charset=utf-8");
          // 为解析类提供配置信息
          DiskFileItemFactory factory = new DiskFileItemFactory();
          // 创建解析类的实例
          ServletFileUpload sfu = new ServletFileUpload(factory);
          // 开始解析,解析实例空间大小的设置
          sfu.setFileSizeMax(1024 * 400);
          // 每个表单域中数据会封装到一个对应的FileItem对象上
          try {
              List<FileItem> items = sfu.parseRequest(request);
              // 区分表单域
              for (int i = 0; i < items.size(); i++) {
                   FileItem item = items.get(i);
                   // isFormField为true,表示这不是文件上传表单域
                   if (!item.isFormField()) {
                        ServletContext sctx = getServletContext();
                        // 获得存放文件的物理路径
                        // upload下的某个文件夹 得到当前在线的用户 找到对应的文件夹
                        String path = sctx.getRealPath("/upload");
                        System.out.println(path);
                        // 获得文件名
                        String fileName = item.getName();
                        System.out.println(fileName);
                        // 该方法在某些平台(操作系统),会返回路径+文件名
                        fileName = fileName
                                  .substring(fileName.lastIndexOf("/") + 1);
                        File file = new File(path + "\\" + fileName);
                        if (!file.exists()) {
                             item.write(file);
                             // 将上传图片的名字记录到数据库中
                             response.sendRedirect("/login/upload/ok.html");
                        }
                   }
              }
          } catch (Exception e) {
              e.printStackTrace();
          }

上传图片和文件属于 enctype = "multipart/form-data"(enctype 是form的一个属性)
form中加入enctype="multipart/form-data" 时整个表单被封装,字符串将转成二进制流,因此request.getParameter("XXX")是得不到的。
     默认情况,传递参数编码格式是application/x-www-form-urlencoded,不能用于图片文件上传,只用使用multipart/form-data,才能完整的传递文件数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值