Servlet筆記2-文件上傳
阿新 • • 發佈:2018-01-15
val 指定 author 文件上傳 create tell url編碼 utf for 。
向服務器上傳文件,表單裏要使用<input type="file" .../>,並且,上傳文件一定要為表單域設置enctype屬性。
表單的enctype屬性指的是表單數據的編碼方式,該屬性有三個值:
1.application/x-www-form-urlencoded:默認的編碼方式,只處理表單域裏的value屬性值,采用這種編碼方式的表單會將表單域的值處理成URL編碼方式
文件上傳示例:
Servlet上傳文件:
Servlet 3.0改進了部分API,其中HttpServletRequest增加了對文件上傳的支持。
HttpServletRequest提供了兩個方法來處理文件上傳:
1.Part getPart(String name):根據名稱來獲取文件上傳域
2.Collection<Part> getParts():獲取所有的文件上傳域
上面兩個方法的返回值都涉及一個API:Part,每個Part對象對應於一個文件上傳域,該對象提供了很多方法來範文上傳文件的文件類型、大小、輸入流等,並提供了一個write(String file)方法將上傳文件寫入服務器磁盤
向服務器上傳文件,表單裏要使用<input type="file" .../>,並且,上傳文件一定要為表單域設置enctype屬性。
表單的enctype屬性指的是表單數據的編碼方式,該屬性有三個值:
1.application/x-www-form-urlencoded:默認的編碼方式,只處理表單域裏的value屬性值,采用這種編碼方式的表單會將表單域的值處理成URL編碼方式
2.multipart/form-data:這種編碼方式會以二進制流的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數裏
3.text/plain:這種編碼方式當表單的action屬性為mailto:URL的形式時比較方便,這種方式主要適用於直接通過表單發送郵件的方式
文件上傳示例:
頁面jsp:
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2018/1/4 Time: 16:46 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Servlet文件上傳</title> </head> <body> <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"> 普通參數:<input type="text" name="inputText" ><br> 選擇文件:<input type="file" name="file" ><br> <input type="submit" value="上傳"> </form> </body> </html>
Servlet程序:
/** * Description:servlet * Author: Eleven * Date: 2018/1/13 16:23 */ @WebServlet(name="upload",urlPatterns = "/upload") @MultipartConfig //處理文件上傳的Servlet,必須要加此註解 public class UploadServlet extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解決接收參數為中文亂碼的問題 request.setCharacterEncoding("UTF-8"); //解決向頁面輸出內容為亂碼,即使用out.println()的時候 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //獲取普通請求參數 String inputText = request.getParameter("inputText"); System.out.println("普通的參數為:"+inputText); //獲取文件上傳域 Part part = request.getPart("file"); //文件的上傳類型 System.out.println("文件的上傳類型:"+part.getContentType()); //文件上傳的大小 System.out.println("上傳文件的大小:"+part.getSize()); //文件上傳域的Header Name Collection<String> headerNames = part.getHeaderNames(); //遍歷文件上傳域的Header Name Value for(String headerName:headerNames){ System.out.println(headerName+"---->"+part.getHeader(headerName)); } //獲取包含原始文件名的字符串 String fileNameInfo = part.getHeader("content-disposition"); //提取上傳文件的文件名 String fileName = fileNameInfo.substring(fileNameInfo.indexOf("filename=\"")+10,fileNameInfo.length()-1); //將文件寫入服務器磁盤 保存在web應用根路徑下的upload文件下 part.write(getServletContext().getRealPath("upload")+"/"+fileName); out.println("文件上傳成功!"); } }
對於傳統的文件上傳需要借助common-fileupload等工具,處理起來有點復雜,借助Servlet 3.0的API,處理文件就變得比較簡單了。
Servlet筆記2-文件上傳