multipart/form-data請求與文件上傳


要上傳文件,需要用post方法,並且設置enctype為multipart/form-data。

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="text" name="param1">
  <input type="text" name="param2">
  <input type="file" name="fileparam">
  <button type="submit">上傳</button>
</form>

 

關於multipart/form-data

multipart/form-data與post方法結合,用了multipart/form-data的post請求與普通的post請求的請求頭和請求體都有不同。

 

普通post請求頭中Content-Type字段值為:

Content-Type: application/x-www-form-urlencoded

multipart/form-data請求頭中Content-Type字段值為multipart/form-data; boundary=xxxxxxx, (xxxxxx規定了請求體中的內容分隔符)。

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryZpsWTsOiRHI0TBW7

 

普通post請求的請求體格式為(不會上傳文件內容):

param1=AAAA&param2=123456&fileparam=test.txt

而multipart/form-data請求體格式為(包含文件內容):

------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="param1"

AAAA
------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="param2"

123456
------WebKitFormBoundaryjUVXJ3PslTEBh9as
Content-Disposition: form-data; name="fileparam"; filename="test.txt"
Content-Type: text/plain

contents of file
------WebKitFormBoundaryjUVXJ3PslTEBh9as

 

后台處理

使用multipart/form-data提交的數據使用HttpServletRequest對象的getParameter()等方法無法讀取。可以讀取整個請求體數據流自己解析數據。但更好的方式是使用已經有的第三方工具類,如fileupload,jspsmartupload。下面的例子中使用的是fileupload。

HttpServletRequeest request=....
if(ServletFileUpload.isMultipartContent(request)) 
{ FileItemFactory factory
= new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); for(FileItem i: items) { i.getFieldName();   //參數名 //i.getString();   //參數值(返回字符串),如果是上傳文件,則為文件內容      //i.get();   //參數值(返回字節數組),如果是上傳文件,則為文件內容
     //i.getSize();     //參數值的字節大小     
//i.getName();     //上傳文件的文件名      //i.getContentType(); //上傳文件的內容類型      if(!i.isFormField()&&i.getSize()>0)   //簡單參數返回true,文件返回false       Files.write(Paths.get("/upload/"+Paths.get(i.getName()).getFileName()), i.get());   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM