首先準備上傳頁面:upload.html
- form的method必須是post卤妒,get不能上傳文件
- 還需要加上
enctype="multipart/form-data"
,表示提交的數據是二進制文件 - 需要提供
type="file"
的字段進行上傳
<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<form action="uploadPhoto" method="post" enctype="multipart/form-data">
英雄名稱:<input type="text" name="heroName" /> <br>
上傳頭像:<input type="file" name="filepath" /> <br>
<input type="submit" value="上傳">
</form>
準備UploadPhotoServlet
- 在UploadPhotoServlet進行上傳功能開發(fā)
- 需要用到兩個第三方的jar包甥绿,
commons-io-1.4.jar
和commons-fileupload-1.2.2.jar
,在下面下載,并放在WEB-INF/bin下 - 選中兩個jar->右鍵->Build Path
- 鏈接:https://pan.baidu.com/s/1THFbmAcfh8tWee0oQVLzyQ
- 提取碼:fwfw
- 完整Servlet代碼
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
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 UploadPhotoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = null;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 設置上傳文件的大小限制為1M
factory.setSizeThreshold(1024 * 1024);
List items = null;
try {
items = upload.parseRequest(req);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (!item.isFormField()) {
// 根據時間戳創(chuàng)建頭像文件
filename = System.currentTimeMillis() + ".jpg";
// 根據getRealPath獲取上傳文件夾
String photoFolder = req.getServletContext().getRealPath("uploaded");
File f = new File(photoFolder, filename);
f.getParentFile().mkdirs();
// 通過item.getInputStream()獲取瀏覽器上傳的文件的輸入流
InputStream is = item.getInputStream();
// 復制文件
FileOutputStream fos = new FileOutputStream(f);
byte b[] = new byte[1024 * 1024];
int length = 0;
while (-1 != (length = is.read(b))) {
fos.write(b, 0, length);
}
fos.close();
} else {
System.out.println(item.getFieldName());
String value = item.getString();
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(value);
}
}
String html = "<img width='200' height='150' src='uploaded/%s' />";
resp.setContentType("text/html");
resp.getWriter().format(html, filename);
}
}
配置web.xml
<servlet>
<servlet-name>UploadPhotoServlet</servlet-name>
<servlet-class>UploadPhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadPhotoServlet</servlet-name>
<url-pattern>/uploadPhoto</url-pattern>
</servlet-mapping>
上傳測試
- 訪問:http://127.0.0.1/upload.html
-
效果圖
image.png
如何處理其他非File字段
- 因為瀏覽器指定了以二進制的形式提交數據则披,那么就不能通過常規(guī)的手段獲取非File字段:
request.getParameter("heroName")
- 在遍歷Item時(Item即對應瀏覽器提交的字段),可以通過:
item.isFormField
,來判斷是否是常規(guī)字段還是提交的文件
image.png
image.png