需要commons-upload 和commons-io 这2个jar包。
提交页面 test.jsp
<%@ 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="FileUpload" enctype="multipart/form-data" method="post">
<input type="text" name="username" /><br />
<input type="file" name="myfile1" /><br/>
<input type="file" name="myfile2" /><br/>
<input type="submit" value="submit" />
</form>
</body>
</html>
FileUpload.java内容:
package com.cstp.upload;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUpload extends HttpServlet {
private static final long serialVersionUID = 5537949684189178272L;
public FileUpload() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
// String path=request.getRealPath("/upload"); 方法已过时,值和第3个path一样
// String path=request.getServletPath(); /FileUpload
String path = request.getSession().getServletContext().getRealPath(
"/upload");
//D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload
factory.setRepository(new File(path));
factory.setSizeThreshold(1024 * 1024);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(-1);
List<FileItem> list = null;
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
list = upload.parseRequest(request);
} catch (FileUploadException ex) {
System.out.println("上传发生异常" + ex.getMessage());
}
// 下面对每个字段进行处理,分普通字段和文件字段
List<String> photoList=new ArrayList();
for (FileItem fileItem : list) {
// 如果是普通字段
if (fileItem.isFormField()) {
System.out.println("文本框的name属性:" + fileItem.getFieldName()
+ "/n文件名:" + fileItem.getName());// 不是文件,所以得不到文件名
} else {
String fieldName = fileItem.getFieldName();
String fileName = fileItem.getName();
int start = fileName.lastIndexOf("//");
fileName = fileName.substring(start + 1);
System.out.println("文本框的name属性:" + fieldName + "/n文件名:"
+ fileName + "/n文件类型:" + fileItem.getContentType()
+ "/n文件大小:" + fileItem.getSize());
//因为2个框,想都在成功页面显示,所以用集合装上他们的名字
photoList.add(fileName);
// if (fileItem.getName() != null && fileItem.getSize() != 0) {
// OutputStream os= new FileOutputStream(new
// File(path,fileName));
//
// InputStream is=fileItem.getInputStream();
// byte[] b=new byte[400];
// int length=0;
// while((length=is.read())>0){
//
//
// os.write(b,0,length-1);
// os.close();
// is.close();
// }
try {
fileItem.write(new File(path, fileName));//也可以用上述方式写到目的地
} catch (Exception e) {
e.printStackTrace();
}
}
}
request.getSession().setAttribute("photo", photoList);
request.getRequestDispatcher("./success.jsp")
.forward(request, response);
}
public void init() throws ServletException {
}
}
success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>
图片上传成功!!!
<table>
<c:forEach var="xx" items="${photo}">
<tr>
<td><img alt="" src="./upload/${xx}"></td>
</tr>
</c:forEach>
</table>
</body>
</html>
需要注意的问题是:上传后 webroot下的upload文件夹里看不到,但是去上传的绝对路径也就是程序中的path:D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/FileUpload/upload 可以看到上传成功了,但是找到项目的路径D:/workspace/FileUpload/WebContent/upload是没有的,所以在项目里怎么刷新也看不到。老师说是一个是开发路径,一个是实际路径。直接用,是可以得到的,只是在项目里看不到。我看的视频,那个风中叶老师的struts2视频的第13讲,可以看到,可能是MyEclipse的视图和Eclipse的视频不一样吧。但是确实可以引用到。像success.jsp就拿到了。效果图我没传。嘿嘿
如果想在D:/workspace/FileUpload/WebContent/upload看到,在web.xml文件里的servlet节点里servlet-class后配置里加上参数表示D:/workspace/FileUpload/WebContent/upload ,原因就是内部认识虚拟路径,是吧!
<servlet>
<servlet-name>FileUpload</servlet-name>
<servlet-class>com.cstp.upload.FileUpload</servlet-class>
<init-param>
<param-name>path</param-name>
<param-value>D:/workspace/FileUpload/WebContent/upload</param-value>
</init-param>
</servlet>
到时,在servlet里的path读到这里配置的值就可以了。
注释掉
String path = request.getSession().getServletContext().getRealPath(
"/upload");
String path=super.getInitParameter("path");
再来一次成功后刷新项目,就会看到上传的文件啦,
D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload 下有没有呢?去看看,结果发现对应的也有。
这就充分说明,D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload
和
D:/workspace/FileUpload/WebContent/upload 是对应的。上面的方式其实也说明了,只是项目里看不到,但直接引用那块的文件,比如一个图片,确实可以显示。
好玩吧。。。。.
8月26日续:
session放的地方不对导致出了点小问题,只显示一个图片。现已通过把session把到for循环外面得以修正!