这里我创建了一个maven工程,直接添加下载的依赖,为何选择maven?由于个人目的是为了完成上传,而不是为了去配置环境~!在上传的时候,必需要添加io这个依赖的包,若是我这里用的是servlet,就须要添加对应的javax.servlet依赖,这是很重要的。另外,在表单提交的时候,enctype="multipart/form-data"是必需要填的,这个在w3c文档里有明确规定,而对于上传的路径、怎么上传等这些则是次要的,因此我没有过多的去判断有什么类型的文件,也就是说,这里我是为了实现servlet上传而实现上传。 这是最基本的原理,不管你是spring mvc上传仍是struts2,其实原理都是差很少的。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="uploadServlet" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="file" /><br> <input type="submit" value="提交" > </form> </body> </html>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Servlet Upload Web Application</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>uploadServlet</servlet-name> <servlet-class>com.iflytek.test.MyUploadServlet</servlet-class> <init-param> <param-name>fileName</param-name> <param-value>myUploadServlet</param-value> </init-param> <init-param> <param-name>cachePath</param-name> <param-value>cachePath</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>uploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern> </servlet-mapping> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: pom.xml 642118 2008-03-28 08:04:16Z reinhard $ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <name>ServletUploadTrain</name> <groupId>com.iflytek.test</groupId> <artifactId>ServletUploadTrain</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.7</version> <configuration> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>8888</port> <maxIdleTime>30000</maxIdleTime> </connector> </connectors> <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory> <contextPath>/</contextPath> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- common-io包 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- fileupload上传配置 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <!-- serlvet配置 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> </dependencies> </project>
package com.iflytek.test; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletConfig; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class MyUploadServlet extends HttpServlet { /** * 文件存放地址 */ private String file_path; /** * 缓存路径 */ private File cacheFile; /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest * , javax.servlet.http.HttpServletResponse) */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } /* * (non-Javadoc) * * @see * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest * , javax.servlet.http.HttpServletResponse) */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doPost(req, resp); // resp.setContentType("text/plain"); // 设置字符集 resp.setCharacterEncoding("GBK"); // PrintWriter printWriter = resp.getWriter(); // 建立一个基于硬盘的工厂,通常用来缓冲 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(5*1024); //设置缓存文件 factory.setRepository(cacheFile); ServletFileUpload fileUpload = new ServletFileUpload(factory); // 页面请求传递的信息量的最大值为20M fileUpload.setSizeMax(20 * 1024 * 1204); // 设置单个文件传递的大小为6m fileUpload.setFileSizeMax(6 * 1024 * 1024); try { List<FileItem> list = fileUpload.parseRequest(req); for (FileItem fileItem : list) { if (fileItem.isFormField()) { // 提交的是表单元素 this.processFormFileld(fileItem, printWriter); } else { this.processUploadFile(fileItem, printWriter); } } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 若是表单中的是文件信息格式,则将文件保存到指定的目录下 * * @param fileItem * 文件信息 * @param printWriter * 输出打印对象 */ private void processUploadFile(FileItem fileItem, PrintWriter printWriter) throws Exception { String filename = fileItem.getFieldName(); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long file_size = fileItem.getSize(); if ("".equals(filename) && file_size == 0) { return; } File upload_file = new File(file_path + "/" + filename); // 系统会自动将临时文件删除 fileItem.write(upload_file); printWriter.println("<p>文件" + filename + "上传成功!</p>"); printWriter.println("<p>文件[" + filename + "]的大小为" + file_size + "</p>"); } /** * 若是表单的信息为文本信息,则打印简单的提示 * * @param fileItem * 文本信息 * @param printWriter * 输出打印对象 */ private void processFormFileld(FileItem fileItem, PrintWriter printWriter) throws Exception { String name = fileItem.getFieldName(); String value = fileItem.getString(); printWriter.println("<p>" + name + ":" + value + "</p>"); } /* * (non-Javadoc) * * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) */ @Override public void init(ServletConfig config) throws ServletException { super.init(config); // 查询要上传文件所在的文件夹是否存在,如不存在就创建一个文件夹 String fileName = config.getInitParameter("fileName"); String cachePath = config.getInitParameter("cachePath"); // 经过虚拟的初始化参数来构建一个真实的文件路径 file_path = this.getServletContext().getRealPath(fileName); cachePath = this.getServletContext().getRealPath(cachePath); File realFile = new File(file_path); cacheFile = new File(cachePath); if(!cacheFile.exists()){ cacheFile.mkdirs(); } if (!realFile.exists()) { // 创建一些列路径 realFile.mkdirs(); } } }