本次文件依靠第三方組件(Apache)進行實現
commons-fileupload組件:
commons-fileupload.jar
jar包下載地址: http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi 操作指南: http://commons.apache.org/proper/commons-fileupload/using.html
commons-io.jar
jar包下載地址: http://commons.apache.org/proper/commons-io/download_io.cgi 操作指南: http://commons.apache.org/proper/commons-io/description.html
1.form表單的method必須是post
2.form表單的組件得是file屬性:比如:<input type="file" name="photoName" >
3.form表單的enctype必須是multipart/form-data 以二進制字節流進行提交 傳統接收參數的方式無效
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE>
<html>
<head>
<title>MrYang Design File Upload</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post" >
名稱<input type="text" name="name" ><br/><br/>
密碼<input type="text" name="pwd" ><br/><br/>
<input type="file" name="photoName" ><br/><br/>
<input type="submit" value="上傳" >
</form>
</body>
</html>
2.servlet中進行接受並且進行上傳處理
package cn.javabs.web.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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;
import org.apache.commons.io.FilenameUtils;
public class UploadServlet extends HttpServlet {
@SuppressWarnings("unchecked")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* Set CharEncoding
*/
response.setContentType("text/html ;charset = utf-8 ");
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
String name = request.getParameter("photoName");
// 1. 用於判斷jsp表單中的enctype 的屬性值是不是multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 如果不是multipart/form-data 則提醒
if (!isMultipart) {
response.getWriter().write("提交的不是multipart/form-data");
return;
}
//實例化 磁盤文件項工廠對象
DiskFileItemFactory factory = new DiskFileItemFactory();
//ServletFileUpload是用於解析request對象
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
// 通過ServletFileUpload得到所有上傳項.每一個FileItem就相當於一個上傳項
items = upload.parseRequest(request);
} catch (FileUploadException e) {
throw new RuntimeException(e);
}
System.out.println("我們來一起看一下items是:" + items);
// 循環取出所有的組件 其中組件包含有 普通組件 和 上傳組件
for (FileItem item : items) {
// 通過判斷確定 item中的普通組件 使用的判斷方法是isFormField
// 是普通的表單字段
if(item.isFormField()){
System.out.println("這是普通的表單字段");
// 獲取表單中的屬性
String fieldName = item.getFieldName();
// 獲取表單中的屬性所對應的值
String fieldValue = item.getString();
System.out.println(fieldName +":" + fieldValue);
}
// 是上傳的表單字段
else{
System.out.println("這是上傳的表單字段");
// 獲取字節輸入流
InputStream in = item.getInputStream();
// 獲取上傳文件的名稱
String uploadName = item.getName();
// 判斷上傳文件的名稱是否為null,如果不為空
if(uploadName != null){
// 文件名稱 = 獲取文件名稱,並且包含后綴
uploadName = FilenameUtils.getName(uploadName);
}
// 文件存放的真實路徑 其實files文件夾 存放在Tomcat服務器的項目里面
String filePath = getServletContext().getRealPath("/files");
// 根據真實的路徑 進行實例化創建目錄
File file = new File(filePath);
// 如果目錄不存在
if(!file.exists()){
//創建多級目錄
file.mkdirs();
}
// 根據 真實目錄 + "\" + 文件名稱 [file.separator 的結果是 "\"]
OutputStream out = new FileOutputStream(filePath + file.separator + uploadName );
// 定義長度 初始化值為0
int len = 0;
//定義字節緩沖區數組
byte [] b = new byte[1024];
// 循環
while ((len = in.read(b))!=-1) {
out.write(b, 0, len);
}
// 關閉輸出流
out.close();
// 關閉輸入流
in.close();
// 刪除臨時文件
item.delete();
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
別忘了還有web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name></display-name>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>cn.javabs.web.controller.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/servlet/UploadServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
