这里我建立了一个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"%>Insert title here
Servlet Upload Web Application index.jsp uploadServlet com.iflytek.test.MyUploadServlet fileName myUploadServlet cachePath cachePath uploadServlet /uploadServlet
4.0.0 war ServletUploadTrain com.iflytek.test ServletUploadTrain 0.0.1-SNAPSHOT org.mortbay.jetty maven-jetty-plugin 6.1.7 8888 30000 ${project.build.directory}/${pom.artifactId}-${pom.version} / junit junit 4.11 commons-io commons-io 2.4 commons-fileupload commons-fileupload 1.2.2 javax.servlet servlet-api 2.5 provided
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 { Listlist = 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(" 文件" + filename + "上传成功!
"); printWriter.println("文件[" + filename + "]的大小为" + file_size + "
"); } /** * 如果表单的信息为文本信息,则打印简单的提示 * * @param fileItem * 文本信息 * @param printWriter * 输出打印对象 */ private void processFormFileld(FileItem fileItem, PrintWriter printWriter) throws Exception { String name = fileItem.getFieldName(); String value = fileItem.getString(); printWriter.println("" + name + ":" + value + "
"); } /* * (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(); } }}