聊聊在Servlet中怎麼上傳文件
首先對Servlet上傳文件的簡單理解
此前,Servlet本身沒有對文件上傳提供直接的支持,一般需要使用第三方框架來實現,這樣就比較麻煩
不過,Servlet3.0之後提供瞭這個功能,而且使用非常簡單,,為此,HTTPServletRequest提供瞭兩個方法用於從請求中解析出上傳的文件:
Part getPart(String name) //獲取請求中給定 name 的文件 Collection<Part> getParts() //獲取所有的文件
其中每一個文件用一個javax.servlet.http.Part對象來表示,該接口提供瞭處理文件的簡易方法,如write(),delete(),那麼,結合 HttpServletRequest 和 Part 來保存上傳的文件變得非常簡單
Part img = request.getPart("img"); img.write("根路徑+\\img.jpg")
註意:可以配合 @MultipartConfig 註解來對上傳操作進行一些自定義的配置,比如限制上傳文件的大小,以及保存文件的路徑等,但是,如果請求的 MIME 類型不是 multipart/form-data,則不能使用上面的兩個方法,否則將拋異常。
首先我們掌握開發Servlet的步驟:
前端:如果有前端內容的話,需要再寫一個html文件
後端
- 首先編寫後臺的Servlet代碼(也即重寫doGet和doPost方法)
- 配置項目文件,web.xml裡面的映射文件
1.首先寫一個頁面(前端) html 文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上傳文件</title> </head> <body> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="img"><p> <input type="submit" value=" 提 交 "> </form> </body> </html>
代碼分析
2.寫Servlet後端類代碼
import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; import java.io.IOException; import java.io.PrintWriter; //首先必須聲明這個類是用來處理(文件)流的【不可獲取】 @MultipartConfig public class FileServlet extends HttpServlet { @Override //因為提交表單隻需要post,那麼這裡就不需要get方法瞭 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //首先拿到流信息,他返回的是一個part對象 Part part = req.getPart("img"); //手下聲明一個保存路徑,這裡保存在D盤的File文件下 String filePath = "D:\\File\\"; //保存文件的名稱這裡就和原文件的名稱一樣,通過part裡面的方法得到原文件名稱 String fileName = part.getSubmittedFileName(); //通過write方法,可以將這個png文件保存在任意路徑下,write裡面的參數,就是要保存的路徑 part.write(filePath+fileName); //然後給前端返回響應的結果 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); writer.println("<h1>上傳成功</h1>"); }}
3.配置web.xml映射
<servlet> <servlet-name>fileServlet</servlet-name> <servlet-class>FileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping>
4.效果展示
存在問題
那麼哪裡存在問題呢?
//首先拿到流信息,他返回的是一個part對象 Part part = req.getPart("img"); //手下聲明一個保存路徑,這裡保存在D盤的File文件下 String filePath = "D:\\File\\"; //保存文件的名稱這裡就和原文件的名稱一樣,通過part裡面的方法得到原文件名稱 String fileName = part.getSubmittedFileName(); //通過write方法,可以將這個png文件保存在任意路徑下,write裡面的參數,就是要保存的路徑 part.write(filePath+fileName);
註意:其實這裡是存在一點問題的
那麼如何進行改進呢?
方法:使用UUID作為文件名
代碼改進:也就是把代碼中的fileName改成如下
//首先需要一個文件名,改進文件名的名稱(防止重復名稱覆蓋之前的文件) String fileName = UUID.randomUUID().toString()+ part.getSubmittedFileName().substring(part.getSubmittedFileName().indexOf("."));
結果驗證:
以上就是聊聊在Servlet中怎麼上傳文件的詳細內容,更多關於Java Servlet上傳文件的資料請關註WalkonNet其它相關文章!