这里我建立了一个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();
}
}
}