JavaWeb簡單文件上傳流程的實戰(zhàn)記錄
引言
這里實現(xiàn)一個簡單的圖片上傳功能,主要是熟悉這個文件上傳的交互流程。關(guān)于更復雜的文件上傳,如大文件的切片上傳、斷點續(xù)傳等,這里不做過多介紹。
前端上傳文件
首先在前端創(chuàng)建一個頁面,這里我們選擇通過form表單的形式上傳文件。在選擇時,使用input標簽中 的file類型就可以自動的選擇本地文件。
<!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="MyImage"> <input type="submit" value="提交圖片"> </form> </body> </html>
代碼解釋:
- 在form標簽中,action屬性后寫入表單數(shù)據(jù)上傳的URL地址,如果不寫,默認上傳到當前頁面,這里我們寫成服務器解析的地址@WebServlet("/upload")。
- method屬性中我們設(shè)為POST方法,即提交表單數(shù)據(jù)的方法,也就是前面我們說的構(gòu)造HTTP請求的方法,并且POST傳輸?shù)臄?shù)據(jù)量大,可視為不受限制。
- enctype=“multipart/form-data”,這個屬性的作用是將表單數(shù)據(jù)編碼格式置為multipart/form-data類型,這個編碼類型會對文件內(nèi)容在上傳時進行處理,以便服務器解析文件的類型和內(nèi)容。
enctype屬性:
application/x-www=form-urlencoded:默認方式,只處理表單域中的 value 屬性值,將表單域中的值處理成URL
編碼方式;
multipart/form-data:以二進制流的方式處理表單數(shù)據(jù),除了表單域中的 value 屬性值,還會處理表單域的文件內(nèi)容,將其封裝到請求參數(shù)中,不會對字符編碼;
text/plain:將空格轉(zhuǎn)換為+號,其它字符不做編碼處理,適用于通過表單發(fā)送郵件。
小結(jié):
- 前端文件上傳實際是文件內(nèi)容的傳遞,是數(shù)據(jù)的傳遞,并非我們常用的文件的拷貝與復制操作。
- 傳遞的過程中藥進行編碼來制定數(shù)據(jù)發(fā)送的規(guī)則,方便后端能夠?qū)崿F(xiàn)一套對應的解析規(guī)則來解析。
- 傳遞的數(shù)據(jù)規(guī)則里面應該包含文件的基本信息,如文件名和文件類型,方便后端解析時能寫出正確格式的文件。
后端接受文件
在服務器這邊處理請求,并將請求中的文件取出并重新保存,最后將代碼部署到Tomcat上.
在解析請求中的文件時,需要用到Servlet中的getPart方法.此方法的參數(shù)是對應的文件名name
在前端上傳文件的時候,可以一次選擇多個文件上傳,其中每個文件,會被包裝成一個Part對象.每個文件都會有自己的文件名name,服務器這邊就可以根據(jù)文件名來找到對應的Part,在Part中就包含了對應文件信息。
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; import java.io.IOException; @MultipartConfig @WebServlet("/upload") public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.從請求對象中,讀取出Part對象 Part part =req.getPart("MyImage"); //2.讀取到Part 對象中的一些參數(shù) System.out.println(part.getSubmittedFileName()); // 上傳文件真實的文件名 System.out.println(part.getContentType()); // 文件的類型 System.out.println(part.getSize()); // 文件的大小 //3.把文件寫入到指定的目錄中 part.write("c:/temp/MyImage.jpg"); //4.返回一個響應,通知用戶上傳成功 resp.getWriter().write("upload OK !"); } }
代碼解釋:
- 接受文件上傳的Servlet,必須有@MultipartConfig注解,否則Servlet不能正確的讀取請求中的文件內(nèi)容
- @WebServlet("/upload")這里的/upload和前端form標簽中的action屬性的值upload正好對應了起來。action屬性會將form表單中的數(shù)據(jù)發(fā)送到對應的URL中,前端將URL設(shè)為upload,那么后端在構(gòu)造url的時候也必須和前端的對應起來。否則訪問不了Tomcat.
- 在Servlet中重寫的具體是哪個方法也要和前端method屬性對應起來,前端用的是Post方法,那么后端在Servlet中重寫的就是doPost方法.
- 在重寫的方法中,我們首先要通過文件名name獲取到對應的Part對象。前端文件名是MyImage,那么這里的參數(shù)就必須是MyImage。
- 獲得對象后,就可以通過Servlet內(nèi)置的一些方法來獲得文件的參數(shù)信息,例如文件名,文件類型,文件大小等。
- 然后通過part.write()方法使文件持久化,也就是將文件保存下來,寫入指定的目錄中。這個方法的參數(shù)就是想要保存的路徑
- 最后可以返回一個響應,通知客戶端上傳成功。
在瀏覽器中輸入URL,發(fā)送請求,開始上傳文件
上傳成功
在本地對應的路徑中,可以看到被上傳的文件
總結(jié)
到此這篇關(guān)于JavaWeb簡單文件上傳的文章就介紹到這了,更多相關(guān)JavaWeb文件上傳流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 2.x 把 Guava 干掉了選擇本地緩存之王 Caffeine(推薦)
這篇文章主要介紹了Spring Boot 2.x 把 Guava 干掉了選擇本地緩存之王 Caffeine,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01Java如何利用Mybatis進行數(shù)據(jù)權(quán)限控制詳解
這篇文章主要介紹了Java如何利用Mybatis進行數(shù)據(jù)權(quán)限控制詳解,數(shù)據(jù)權(quán)限控制最終的效果是會要求在同一個數(shù)據(jù)請求方法中,根據(jù)不同的權(quán)限返回不同的數(shù)據(jù)集,而且無需并且不能由研發(fā)編碼控制。,需要的朋友可以參考下2019-06-06SpringBoot中的@CacheEvict 注解的實現(xiàn)
本文主要介紹了SpringBoot中的@CacheEvict注解的實現(xiàn),@CacheEvict 注解用于清空緩存,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03Java中HashSet和HashMap的區(qū)別_動力節(jié)點Java學院整理
這篇文章主要介紹了Java中HashSet和HashMap的區(qū)別_動力節(jié)點Java學院整理,需要的朋友可以參考下2017-04-04IDEA JetBrains Mono字體介紹和安裝教程(詳解)
這篇文章主要介紹了IDEA JetBrains Mono字體介紹和安裝教程,本給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03SpringMVC的注解@RequestMapping屬性及使用
這篇文章主要為大家介紹了SpringMVC注解@RequestMapping屬性及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Java使用DFA算法實現(xiàn)過濾多家公司自定義敏感字功能詳解
這篇文章主要介紹了Java使用DFA算法實現(xiàn)過濾多家公司自定義敏感字功能,結(jié)合實例形式分析了DFA算法的實現(xiàn)原理及過濾敏感字的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08