Multipartconfig注解具有以下屬性:
fileSizeThreshold: 我們可以指定大小的閾值后,該文件將被寫入磁盤。大小值是字節(jié),所以1024 * 1024 * 10是MB。
location: 文件將被存儲在目錄默認路徑下,它的默認值是“”。
maxFileSize: 最大允許上傳文件的大小,它的值是以字節(jié)形式提供的。它的默認值是-1L意味著無限的。
maxRequestSize: 允許的最大值為multipart/form-data的請求。默認值為-1L,意味著無限的。
@MultipartConfig(fileSizeThreshold=1024*1024*10, // 10 MB maxFileSize=1024*1024*50, // 50 MB maxRequestSize=1024*1024*100) // 100 MB在線API文檔:
http://docs.Oracle.com/javaee/6/api/javax/servlet/http/Part.html
常用方法:
void delete() //刪除文件項的基礎存儲,包括刪除任何相關的臨時磁盤文件。java.util.Collection<java.lang.String> getHeaderNames() //獲取此部分的標頭名稱。java.util.Collection<java.lang.String> getHeaders(java.lang.String name) //獲取給定名稱的部分標頭的值。java.io.InputStream getInputStream() //獲取標頭內(nèi)容的輸入流java.lang.String getName() //獲取此部分的名稱。long getSize() //返回該文件的大小。void write(java.lang.String fileName) //將上傳文件寫入到磁盤方便的方法

JavaEE 7新增了一個方法:
String getSubmittedFileName() //獲取由客戶端指定的文件名
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>上傳圖片</title></head><body><div> <p>請選擇上傳需要上傳的文件</p> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="filename"/><br /> <button type="submit" >提交</button> </form> <p>${ msg}</p></div></body></html>UploadServlet.java
import java.io.IOException;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;/** * Servlet implementation class UploadServlet */@WebServlet("/UploadServlet")@MultipartConfig(location="f://") //指定文件保存在F://目錄下public class UploadServlet extends HttpServlet { PRivate static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //拿到請求的part部件 Part part = request.getPart("filename"); String disposition = part.getHeader("content-disposition"); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("http://") + 1, disposition.lastIndexOf(".")); //截取到文件名的后綴 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //隨機生成一個UUID String uuid = UUID.randomUUID().toString(); //保存到f://目錄下 part.write(uuid + name + suffix); request.setAttribute("msg", "上傳成功!"); request.getRequestDispatcher("upload.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}選擇一張圖片上傳


上傳成功后保存在F:盤下

upload.jsp
這時候要添加多個input標簽
<div> <p>請選擇上傳需要上傳的文件</p> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="filename"/><br /> <input type="file" name="filename"/><br /> <input type="file" name="filename"/><br /> <button type="submit" >提交</button> </form> <p>${ msg}</p></div>UploadServlet.java
import java.io.IOException;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;/** * Servlet implementation class UploadServlet */@WebServlet("/UploadServlet")@MultipartConfig(location="f://") //指定文件保存在F://目錄下public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //遍歷所有的part部件 for (Part part : request.getParts()) { String disposition = part.getHeader("content-disposition"); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("http://") + 1, disposition.lastIndexOf(".")); //截取到文件名的后綴 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //隨機生成一個UUID String uuid = UUID.randomUUID().toString(); part.write(uuid + name + suffix); request.setAttribute("msg", "上傳成功!"); } request.getRequestDispatcher("upload.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}選擇3個文件同時上傳

上傳成功后保存在F:盤下

剛剛已經(jīng)演示過上傳多個文件,在三個input框中都選擇了需要上傳的文件,測試時是可以正常上傳的。
但是如果在上傳多個文件的時候,故意有一個input框未選擇文件會發(fā)什么呢?

點擊提交的時候就會報錯:

原因是因為
在截取文件名的時候找不到最后一個“/”form-data; name="filename"; filename=""
這時需要改造一下代碼,加一些邏輯判斷
//遍歷所有的part部件for (Part part : request.getParts()) { //如果表單文件名不為空,才執(zhí)行下列操作 if(!part.getSubmittedFileName().equals("")){ String disposition = part.getHeader("content-disposition"); System.out.println(disposition); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("http://") + 1, disposition.lastIndexOf(".")); //截取到文件名的后綴 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //隨機生成一個UUID String uuid = UUID.randomUUID().toString(); part.write(uuid + name + suffix); request.setAttribute("msg", "上傳成功!"); }}再次提交單個文件的時候就不會出現(xiàn)異常了

上傳成功后保存在F:盤下

新聞熱點
疑難解答