java积累——apache commons fileupload 实现文件上传

简介: java积累——apache commons fileupload 实现文件上传

引言


之前在做.net项目的时候经常会遇到文件上传和下载的需求,现在在java中同样有了这样的需求,其实做法和.net差不多都是采用了第三方的东西来实现,今天就利用apache commons fileupload来实现文件的上传。


jar包引入


1、commons-fileupload-1.1.1.jar需要引入


2、commons-io-1.2.jar需要引入


html页面代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>index.html</title>
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  </head>
  <body>
    <form action="./servlet/item/FileUploadServlet" method="post"
      enctype="multipart/form-data" name="form1">
      <input type="file" name="file">
      <input type="submit" name="Submit" value="upload">
    </form>
    <form action="./servlet/HelloWord" method="post">
      <input type="submit" />
    </form>
    <form name="uploadform" method="POST" action="./servlet/item/FileUploadServlet"
      ENCTYPE="multipart/form-data">
      <table border="1" width="450" cellpadding="4" cellspacing="2"
        bordercolor="#9BD7FF">
        <tr>
          <td width="100%" colspan="2">
            文件1:
            <input name="x" size="40" type="file">
          </td>
        </tr>
        <tr>
          <td width="100%" colspan="2">
            文件2:
            <input name="y" size="40" type="file">
          </td>
        </tr>
        <tr>
          <td width="100%" colspan="2">
            文件3:
            <input name="z" size="40" type="file">
          </td>
        </tr>
      </table>
      <br />
      <br />
      <table>
        <tr>
          <td align="center">
            <input name="upload" type="submit" value="开始上传" />
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>

在html页面中我们需要注意的地方就是 form表单的头部的设置,提交方式必须为post提交,表单编码方式必须为:enctype="multipart/form-data"。这样我们在servlet中才能接收道文件的相关信息完成上传。


创建一个servlet实现逻辑


package com.bjpowernode.drp.basedata.web;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
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 FileUploadServlet extends HttpServlet {
   private ItemManager itemManager; 
  // 用于存放上传文件的目录
  private File uploadPath;
  private File tempPath;
  public void doPost(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {
    // form提交采用multipart/form-data,无法采用req.getParameter()取得数据
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // maximum size that will be stored in memory
    factory.setSizeThreshold(4096);
    // the location for saving data that is larger than getSizeThreshold()
    factory.setRepository(tempPath);
    ServletFileUpload upload = new ServletFileUpload(factory);
    // maximum size before a FileUploadException will be thrown
    upload.setSizeMax(1000000 * 20);
    try {
      List fileItems = upload.parseRequest(req);
      String itemNo = "";
      for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
        FileItem item = (FileItem) iter.next();
        // 是普通的表单输入域
        if (item.isFormField()) {
          if ("itemNo".equals(item.getFieldName())) {
            itemNo = item.getString();
          }
        }
        // 是否为input="type"输入域
        if (!item.isFormField()) {
          String fileName = item.getName();
          long size = item.getSize();
          if ((fileName == null || fileName.equals("")) && size == 0) {
            continue;
          }
          // 截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
          fileName = fileName.substring(
              fileName.lastIndexOf("\\") + 1, fileName.length());
          // item.write(new File(uploadPath + itemNo + ".gif"));
          item.write(new File(uploadPath, fileName));
          itemManager.uploadItemImage(itemNo, fileName);
        }
      }
      res.sendRedirect(req.getContextPath()
          + "/servlet/item/SearchItemServlet");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public void init() throws ServletException {
    uploadPath = new File(getServletContext().getRealPath("upload"));
    // 如果目录不存在
    if (!uploadPath.exists()) {
      // 创建目录
      uploadPath.mkdir();
    }
    // 临时目录
    tempPath = new File(getServletContext().getRealPath("temp"));
    if (!tempPath.exists()) {
      tempPath.mkdir();
    }
     itemManager = new ItemManagerImpl();
  }
}


我们将获取到的文件的名称(包括文件的后缀)存储在数据库中的一个字段中,这样我们在图片预览的时候会根据数据库返回的名称来实现图片的显示。


我们上传的文件存储在G:\myeclipseWorkSpace\apache-tomcat-7.0.63\webapps\drp2.0\upload,当然apache-tomcat-7.0.63之前的路径根据项目存放的位置不同而改变。


总结


上面代码就可以粗略的完成了一个文件上传的功能了,当时实现方式有很多,这只是其中的一种,希望有别的更好的实现的读者可以共享。

目录
相关文章
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
942 23
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
210 1
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
482 1
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
308 1
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
2131 0
|
Java 应用服务中间件 Apache
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
481 7
|
Java 数据库连接 Apache
深入理解Apache Commons Pool2池化技术
深入理解Apache Commons Pool2池化技术
|
监控 Java 数据库连接
Java一分钟之-JDBC连接池:HikariCP, Apache DBCP, C3P0
【6月更文挑战第14天】本文介绍了Java中常用的三种JDBC连接池——HikariCP、Apache DBCP和C3P0。HikariCP以其高性能和低延迟领先,适合高并发环境;Apache DBCP稳定易配置;C3P0则提供高度可定制选项。文章讨论了各连接池的常见问题及避免策略,如配置不当、连接泄露等,并给出示例代码以供参考。选择合适的连接池并正确配置能有效提升应用性能。
750 7
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【6月更文挑战第30天】Apache Kafka是分布式消息系统,用于高吞吐量的发布订阅。在Java中,开发者使用Kafka的客户端库创建生产者和消费者。生产者发送序列化消息到主题,消费者通过订阅和跟踪偏移量消费消息。Kafka以持久化、容灾和顺序写入优化I/O。Java示例代码展示了如何创建并发送/接收消息。通过分区、消费者组和压缩等策略,Kafka在高并发场景下可被优化。
350 1
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
307 0

热门文章

最新文章

推荐镜像

更多