要做到文件上傳,客戶端編程有幾個要點
method的值使用post
enctype的值使用multipart/form-data
每一個控件都要有那麼屬性
例如
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file1"><br />
<input type="submit" value="上傳" />
</form>
Servlet配置
1.在Servlet類上使用@MultipartConfig
MultipartConfig的屬性
1.fileSizeThershold int型 是(可選) 描述:當前數據量大於該值時,內容將被寫入文件。
2.location String型 是(可選) 描述:存放生成文件的地址
3.maxFileSize long型 是(可選) 描述:允許上傳的文件最大值,默認爲-1,表示沒有限制。
4.maxRequestSize long型 是(可選) 描述:針對 multipart/form-data 請求的最大數量,默認爲-1,表示沒有限制。
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
2.在web.xml文件的servlet標籤中使用multipart-config標籤
<servlet>
<servlet-name>uploadservlet</servlet-name>
<servlet-class>com.tanlan.javaees1.UploadServlet</servlet-class>
<multipart-config />
</servlet>
<servlet-mapping>
<servlet-name>uploadservlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
獲取文件上傳中文件本身的信息
在Multipart請求中,每一個表單控件,都會被轉化成一個Part
怎麼獲取Part呢?
使用HttpServletRequest獲取Part
getPart:返回指定名稱的part
getParts:返回請求中所有的part
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part part = request.getPart("file1");
System.out.println(part.getName());
System.out.println(part.getSubmittedFileName());
System.out.println(part.getSize());
System.out.println(part.getContentType());
Collection<String> heardersNames = part.getHeaderNames();
for (String headerName : heardersNames) {
System.out.println(headerName + ":" + part.getHeader(headerName));
}
String uploadDir=getServletContext().getRealPath("/upload");
part.write(uploadDir+"\\"+part.getSubmittedFileName());
}
}
Part接口的方法請參考相關的API文檔
接下來有幾個比較重要的方法:
write:參數是絕對位置,若是相對位置,則相對location的值
delete刪除上傳的文件
getInputStream:獲取輸入流
參數是絕對位置的時候
uploadDir=getServletContext().getRealPath("/upload");
part.write(uploadDir+"\\"+part.getSubmittedFileName());
相對位置的時候
@WebServlet("/upload2")
@MultipartConfig(maxRequestSize=1024*1024*15,maxFileSize=1024*1024*8,location="C:\\")
public class UploadServlet2 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("name"));
Collection<Part> parts=request.getParts();
for (Part part : parts) {
//文件
if(part.getContentType()!=null){
String fileName=part.getSubmittedFileName();
if(!fileName.equals("")){
part.write(fileName);
}
}
}
}
服務器端編程要點:
檢查Part是普通表單控件還是文本上傳控件,判斷content-type的值是否是null
檢查文件名是否爲null,爲空則表示未選擇上傳文件,判斷文件名是否是””
文件存在則調用part的write方法,傳入一個絕對路徑或相對於location屬性指定的路徑
System.out.println(request.getParameter("name"));
Collection<Part> parts=request.getParts();
for (Part part : parts) {
//文件
if(part.getContentType()!=null){
String fileName=part.getSubmittedFileName();
if(!fileName.equals("")){
part.write(fileName);
}
}
}