基于java文件上傳-原始的Servlet方式
前言:干了這幾個(gè)項(xiàng)目,也做過(guò)幾次文件上傳下載,要么是copy項(xiàng)目以前的代碼,要么是百度的,雖然做出來(lái)了,但學(xué)習(xí)一下原理弄透徹還是很有必要的。剛出去轉(zhuǎn)了一圈看周?chē)袥](méi)有租房的,在北京出去找房子是心里感覺(jué)最不爽的時(shí)候,沒(méi)有歸屬感,房租還不便宜,RT,不能好高騖遠(yuǎn),還是腳踏實(shí)地一點(diǎn)一點(diǎn)學(xué)技術(shù)吧,終將有一日,工資會(huì)漲的。
java文件上傳
傳統(tǒng)的文件上傳,不用jquery插件的話,就是用form表單提交,項(xiàng)目里用過(guò)uploadify,可以異步上傳文件,原理我也沒(méi)研究?,F(xiàn)在說(shuō)傳統(tǒng)的form表單上傳文件。
文件上傳核心:
用<input type=”file”/> 來(lái)聲明一個(gè)文件域。樣式如 文件:_____ <瀏覽>.
必須使用post方式提交表單。
必須設(shè)置表單的類(lèi)型為multipart/form-data.是設(shè)置這個(gè)表單傳遞的不是key=value值。傳遞的是字節(jié)碼.
新建web項(xiàng)目:
jsp form表單:enctype(編碼類(lèi)型)的默認(rèn)值就是 application/x-www-form-urlencoded
瀏覽器查看 http報(bào)文:
主要參數(shù):Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 接收服務(wù)器返回的類(lèi)型,*/*表示所有。Referer:http://localhost:8888/upload/ 來(lái)自哪個(gè)網(wǎng)站Accept-Language:zh-CN,zh;q=0.8 :請(qǐng)求回應(yīng)中首選的語(yǔ)言為簡(jiǎn)體中文Accept-Encoding:gzip, deflate, br支持的壓縮格式User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 用戶瀏覽器類(lèi)型Host:localhost:8888 主機(jī)地址Connection:keep-alive 報(bào)文發(fā)送完畢后仍然保持連接Cache-Contrp: max-age=0 緩存Content-Length: 41 41字節(jié)對(duì)文件上傳來(lái)說(shuō),重要的參數(shù)是:Content-Type: application/x-www-form-urlencoded這個(gè)參數(shù)只有post請(qǐng)求才有,默認(rèn)就是application/x-www-from-urlencoded ,Content-type表示正文類(lèi)型,get方式?jīng)]有正文,因?yàn)閰?shù)在url里。在Servlet里可以用request對(duì)象取到Content-type:request.getHeader("Content-type"); 默認(rèn)的值為 application/x-www-form-urlencoded,如果是get請(qǐng)求,則 request.getHeader("Content-type");為null。下圖是get請(qǐng)求時(shí)的http頭信息:
文件上傳,必須設(shè)置enctype="multipart/form-data"
from表單:上傳一個(gè)word:
此時(shí)的http消息: Content-Type:multipart/form-data; boundary=----WebKitFormBou ndarywYwQ3v1NemO0bPfM 。
其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上傳的分隔符。
看請(qǐng)求的報(bào)文: boundry=xxxxx 標(biāo)識(shí)文件開(kāi)始,也有文件頭,說(shuō)的是上傳的數(shù)據(jù)的類(lèi)型,第一個(gè)input 是text類(lèi)型,第二個(gè)是二進(jìn)制,content-type 是application/octet-stream 表示 二進(jìn)制流。上傳圖片,Content-Type: image/jpeg,上傳文本,Content-Type: text/plain。
二進(jìn)制流的接收:當(dāng)表單類(lèi)型是post類(lèi)型,切enctype="multipart/form-data",則所有的數(shù)據(jù)都是以二進(jìn)制流的形式向服務(wù)器上傳,所以request.getParameter("xxx") 永遠(yuǎn)為null,只能通過(guò)req.getInputStream(); 獲取正文。上傳一個(gè)txt:
Servlet:
package com.lhy.upload; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * * @author Administrator * */ @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet") public class UploadServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String contentType = req.getHeader("Content-type"); System.out.println("contentType: "+contentType); String name = req.getParameter("name"); System.out.println(name);//null InputStream is = req.getInputStream(); // ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA // Content-Disposition: form-data; name="image"; filename="靜夜思.txt" // Content-Type: text/plain // // // ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA-- BufferedReader br = new BufferedReader(new InputStreamReader(is)); String firstLine = br.readLine();//第一行,分隔符 String fileName = br.readLine(); // Content-Disposition: form-data; name="image"; filename="jingyesi.txt" fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1); br.readLine(); br.readLine(); String data = null; //獲取當(dāng)前項(xiàng)目的運(yùn)行路徑 String path = getServletContext().getRealPath("/up"); PrintWriter pw = new PrintWriter(path+"/"+fileName); while((data = br.readLine()) != null){ if(data.equals(firstLine+"--")){ break ; //讀到了文件尾 } pw.println(data); } pw.flush(); pw.close(); is.close(); /* FileOutputStream fos = new FileOutputStream(path+"/"+"b.doc"); // byte[] b = new byte[1024]; int len = 0; while((len = is.read()) != -1){ fos.write(len); } fos.flush(); fos.close(); is.close();*/ } }
項(xiàng)目里:
例子只是讀取了txt,其他的二進(jìn)制需要使用inputStream讀取。
以上這篇基于java文件上傳-原始的Servlet方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- JavaServlet的文件上傳和下載實(shí)現(xiàn)方法
- Java Servlet簡(jiǎn)單實(shí)例分享(文件上傳下載demo)
- java基于servlet編寫(xiě)上傳下載功能 類(lèi)似文件服務(wù)器
- Java Servlet上傳圖片到指定文件夾并顯示圖片
- java基于servlet實(shí)現(xiàn)文件上傳功能解析
- java基于servlet的文件異步上傳
- java基于servlet實(shí)現(xiàn)文件上傳功能
- java基于servlet使用組件smartUpload實(shí)現(xiàn)文件上傳
- java web中的servlet3 upload上傳文件實(shí)踐
- 簡(jiǎn)單操作實(shí)現(xiàn)Java jsp servlet文件上傳過(guò)程解析
- JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法詳解
相關(guān)文章
Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-10-10Spring Bean Scope 有狀態(tài)的Bean與無(wú)狀態(tài)的Bean
這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無(wú)狀態(tài)的Bean,每個(gè)用戶有自己特有的一個(gè)實(shí)例,在用戶的生存期內(nèi),bean保持了用戶的信息,下面來(lái)了解有狀態(tài)和無(wú)狀態(tài)的區(qū)別吧2022-01-01Java子類(lèi)實(shí)例化總是默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造操作
這篇文章主要介紹了Java子類(lèi)實(shí)例化總是默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10Java編程synchronized與lock的區(qū)別【推薦】
互聯(lián)網(wǎng)信息泛濫環(huán)境下少有的良心之作!如果您想對(duì)Java編程synchronized與lock的區(qū)別有所了解,這篇文章絕對(duì)值得!分享給大家,供需要的朋友參考。不說(shuō)了,我先學(xué)習(xí)去了。2017-10-10java集合類(lèi)ArrayList和Vector的區(qū)別面試精講
這篇文章主要為大家介紹了java集合類(lèi)ArrayList和Vector的區(qū)別面試全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10