web.xml中
<web-app version="3.0"
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_3_0.xsd">
<context-param>
<param-name>file-upload</param-name>
<param-value>D:/apache-tomcat-7.0.54/webapps/eshop/data/</param-value> // ----->保存文件的路径,前提路径已经存在
</context-param>
Servlet 中 :
doPost(){
ServletContext context = request.getServletContext();
String filePath = context.getInitParameter("file-upload");
String contentType = request.getContentType();
FileUpload.upload(filePath,contentType,request);
request.getRequestDispatcher("/WEB-INF/jsp/GoodsAction/success.jsp").forward(request, response);
}
FileUpload.java
package com.wl.eshop.util;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUpload {
public static void upload(String filePath,String contentType,HttpServletRequest request){
File file ;
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
System.out.println("---------------->");
//-------------->
// // 验证上传内容了类型
if ((contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存中存储文件的最大值
factory.setSizeThreshold(maxMemSize);
// 本地存储的数据大于 maxMemSize.
factory.setRepository(new File("c:\\temp"));
// 创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大上传的文件大小
upload.setSizeMax( maxFileSize );
try{
List fileItems = upload.parseRequest(request);
// 解析获取的文件
Iterator i = fileItems.iterator();
while ( i.hasNext () )
{
FileItem fi = (FileItem)i.next(); // -------->使用FileItem写文件
if ( !fi.isFormField () ) // 如果不是普通字段
{
String fieldName = fi.getFieldName(); // -> input 字段 photo
String fileName = UUID.randomUUID().toString();
String mycontent = new String(fi.getString().getBytes("iso8859-1"), "utf-8");
System.out.println("filedName"+fieldName+" "+"fileName "+fileName);
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
String houzhui ="";
// 获取文件的后缀名
if(fi.getName().lastIndexOf(".") !=-1&&fi.getName().lastIndexOf(".")!=0){ // 如果1。有后缀且 2.不是 .ss 文件 (.在第一个位置上)
houzhui = fi.getName().substring(fi.getName().lastIndexOf("."));
}
// 如 文件名是 "lovegirl/s.jpg" 文件名裡面有/的情況
if( fileName.lastIndexOf("\\") != -1 ){
file = new File( filePath,fileName.substring( fileName.lastIndexOf("\\") )+houzhui) ;
}
else{
file = new File( filePath,fileName.substring( fileName.lastIndexOf("\\")+1 )+houzhui) ;
}
fi.write( file ) ;
}
}
}catch(Exception ex) {
System.out.println(ex);
}
}else{
System.out.println("-------------->"+"文件上传成功");
}
//-------------->
}
private static String getFileExtension(File file) {
String fileName = file.getName();
if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
} else {
return "";
}
}
}
ileItem类的常用方法
1.boolean isFormField()。isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段。如果是普通文本表单字段,返回一个true否则返回一个false。因此可以用该方法判断是否是普通表单域还是文件上传表单域。
2.String getName()。getName方法用来获得文件上传字段中的文件名。
3.String getFieldName()。getFieldName方法用来返回表单标签的name属性的值。
4.void write(File file)。write方法将FileItem对象中的内容保存到某个指定的文件中。如果FileItem对象中的内容是保存在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。
5.String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。它有两个重载形式。public java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码。如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
6.String getContentType()。此方法用来获得上传文件的类型,即标段字段元素描述头属性“content-type”的值,如image/jpeg。如果FileItem对象对应的是普通的表单字段,将返回null。
7.boolean isInMemory()。判断FileItem对象封装的数据是保存在内存中还是硬盘中。
8.void delete()。此方法用来清空FileItem对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文件删除。
9.InputStream getInputStream()。以流的形式返回上传文件的主体内容。
10.long getSize()。返回上传文件的大小。