需要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循環外面得以修正!