2020-03-30

文件上傳



(一)文件上傳的概述


一、什么是文件上傳


? ? 文件上傳:將本地的文件通過流寫入到服務(wù)器的過程


二、為什么要學(xué)習(xí)文件上傳


? ? 實際開發(fā)中有很多應(yīng)用:


? ? ? ? QQ空間上傳圖片


? ? ? ? 招聘網(wǎng)站上傳簡歷


三瓷耙、文件上傳的技術(shù)


? ? JSPSmartUpload:應(yīng)用在JSP上的文件上傳和下載的組件


? ? FileUpload:應(yīng)用在Java環(huán)境上的文件上傳的功能


? ? Servlet3.0:提供了文件上傳的功能


? ? Struts2:提供了文件上傳的功能


四、文件上傳的三個要素


? ? 1、表單的提交的方式需要是POST(因為GET有大小限制)


? ? 2、表單中需要有<input type="file">元素免糕,還需要有name屬性和值


? ? 3、表單屬性必須設(shè)置enctype="multipart/form-data"


(二)文件上傳的原理分析


一忧侧、抓包分析


1石窑、沒有設(shè)置enctype屬性


POST /web06/jsp/upload.jsp HTTP/1.1


Host: localhost:8080


Connection: keep-alive


Content-Length: 23


Cache-Control: max-age=0


Origin: http://localhost:8080


Upgrade-Insecure-Requests: 1


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


User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36


Sec-Fetch-User: ?1


Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9


Sec-Fetch-Site: same-origin


Sec-Fetch-Mode: navigate


Referer: http://localhost:8080/web06/jsp/upload.jsp


Accept-Encoding: gzip, deflate, br


Accept-Language: zh-CN,zh;q=0.9


Cookie: JSESSIONID=5EC0B8AC2ED01283DEE896BC835C05FB


info=aaa&upload=aaa.txt


? ? ? ? *注意:沒有文件上傳中的文件的具體內(nèi)容


2、設(shè)置enctype屬性


POST /web06/jsp/upload.jsp HTTP/1.1


Host: localhost:8080


User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0


Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8


Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2


Accept-Encoding: gzip, deflate


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


Content-Length: 344


Origin: http://localhost:8080


Connection: keep-alive


Referer: http://localhost:8080/web06/jsp/upload.jsp


Cookie: JSESSIONID=00D32978472B2FE2E35796855713EE40; Pycharm-8dbeb98c=1f31b81e-d44c-45f8-95c1-2b06c10aea65


Upgrade-Insecure-Requests: 1


-----------------------------66193578536799190642897124112


Content-Disposition: form-data; name="info"


aaa


-----------------------------66193578536799190642897124112


Content-Disposition: form-data; name="upload"; filename="aaa.txt"


Content-Type: text/plain


hello world!!


-----------------------------66193578536799190642897124112--




二苍柏、文件上傳的原理分析


手動實現(xiàn)文件上傳:


(1)獲得分割線


(2)獲得請求體的所有內(nèi)容:request.getInputStream();


(3)利用分割線將獲得內(nèi)容進行分割


(4)判斷是普通項還是文件上傳項


普通項:獲得普通項名稱和值


文件上傳項:獲得文件名稱和文件內(nèi)容尼斧,通過流寫到服務(wù)器上


(三)文件上傳的代碼實現(xiàn)


一、引入文件上傳的相關(guān)jar包


二试吁、編寫文件上傳的頁面


三、編寫文件上傳的Servlet


(四)文件上傳的API


一楼咳、DiskFileItemFactory:磁盤文件項工廠


1熄捍、構(gòu)造方法:


DiskFileItemFactory()


DiskFileItemFactory(int sizeThreshold, File repository)


sizeThreshold:用來設(shè)置文件上傳的緩沖區(qū)的大小,默認值為10KB


repository:用來設(shè)置文件上傳過程中所產(chǎn)生的臨時文件存放的路徑


2母怜、方法:


setRepository(File repository):設(shè)置緩沖區(qū)的大小


setSizeThreshold(int sizeThreshold):設(shè)置臨時文件存放的路徑


3余耽、API的使用的代碼


二、ServletFileUpload:核心解析類


1苹熏、構(gòu)造方法


ServletFileUpload()


ServletFileUpload(FileItemFactory fileItemFactory)


2碟贾、方法


isMultipartContent(HttpServletRequest request)


是用來判斷表單的enctype屬性是否正確


parseRequest(HttpServletRequest request)


解析Request對象,返回一個List集合(每個部分的對象FileItem)


(long fileSizeMax)


用來設(shè)置單個文件的大小


setSizeMax(long sizeMax)


用來設(shè)置上傳的文件的總大小


setHeaderEncoding(String encoding)


用來解決中文文件名上傳的亂碼的問題


setProgressListener(ProgressListener pListener)


設(shè)置監(jiān)聽文件上傳的進度


三轨域、FileItem文件項


1袱耽、方法


isFormField()


判斷表單項是普通項還是文件上傳項,如果為true代表是普通項


2干发、普通項的方法


getFieldName()


用來獲得普通項的名稱


getString()


用來獲取普通項的值


getString(String encoding)


用來獲取普通項的值(可解決亂碼問題)


3朱巨、文件上傳項


getName()


獲得上傳文件的文件名的方法


getInputStream()


獲得上傳文件的文件內(nèi)容的方法


getSize()


獲得上傳文件的文件大小


delete()


刪除文件上傳過程中的臨時文件


(五)JS控制多文件上傳


一、案例需求


? ? 案例需求描述


二枉长、案例實現(xiàn)


? ? 案例代碼實現(xiàn)


(六)文件上傳兼容瀏覽器問題及解決


一冀续、問題描述


? ? 如果使用IE老版本的瀏覽器,會出現(xiàn)一個文件名稱獲取錯誤的問題必峰,因為老版本IE獲取文件名稱的時候洪唐,會帶有路徑


二、問題解決


(七)文件上傳同一個目錄下文件同名的問題及解決


一吼蚁、問題描述


? ? 張三向服務(wù)器上傳了一個文件aa.txt凭需,內(nèi)容是Hello World,李四向服務(wù)器上傳了一個文件aa.txt,內(nèi)容是Hello Java功炮,后上傳的文件將先上傳的文件覆蓋了


二溅潜、問題解決


? ? 使用唯一文件名來解決


(八)文件上傳同一個目錄下存放文件過多的問題及解決


一、問題描述


? ? 現(xiàn)在所有的用戶都上傳文件薪伏,如果網(wǎng)站訪問量比較大滚澜,如果都上傳到同一個目錄下,此目錄下存放的文件太多了嫁怀,也會對程序有影響(在打開該目錄的時候都會很卡设捐,更別說讀寫了,效率會更低)


二塘淑、問題解決


1萝招、目錄分離


按時間分離:按月、周存捺、天槐沼、小時


按用戶分離:按張三、李四


按個數(shù)分離:一個目錄下存放3000個文件


按目錄分離分離算法:按照某種特定算法進行分離


上傳一個文件捌治,得到一個唯一的文件名


獲取唯一文件名的hashCode值——int類型的值(占8個字節(jié)32位)


讓hashCode的值& 0xf;——得出的這個值作為一級目錄


讓hashCode右移4位再 & 0xf;——得出的這個值作為二級目錄


依此類推……


2岗钩、分析算法:


依此類推:共得到8級目錄,每級目錄中又會有從0000-1111的16級子目錄肖油,我們就能得到16的8次方個兼吓,約43億個目錄


3、算法實現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末森枪,一起剝皮案震驚了整個濱河市视搏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌县袱,老刑警劉巖浑娜,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異显拳,居然都是意外死亡棚愤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門杂数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宛畦,“玉大人,你說我怎么就攤上這事揍移〈魏停” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵那伐,是天一觀的道長踏施。 經(jīng)常有香客問我石蔗,道長,這世上最難降的妖魔是什么畅形? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任养距,我火速辦了婚禮,結(jié)果婚禮上日熬,老公的妹妹穿的比我還像新娘棍厌。我一直安慰自己,他們只是感情好竖席,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布耘纱。 她就那樣靜靜地躺著,像睡著了一般毕荐。 火紅的嫁衣襯著肌膚如雪束析。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天憎亚,我揣著相機與錄音员寇,去河邊找鬼。 笑死第美,一個胖子當(dāng)著我的面吹牛丁恭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斋日,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墓陈!你這毒婦竟也來了恶守?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贡必,失蹤者是張志新(化名)和其女友劉穎兔港,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仔拟,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡衫樊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了利花。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片科侈。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炒事,靈堂內(nèi)的尸體忽然破棺而出臀栈,到底是詐尸還是另有隱情,我是刑警寧澤挠乳,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布权薯,位于F島的核電站姑躲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盟蚣。R本人自食惡果不足惜黍析,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屎开。 院中可真熱鬧阐枣,春花似錦、人聲如沸牍戚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽如孝。三九已至宪哩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間第晰,已是汗流浹背锁孟。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茁瘦,地道東北人品抽。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像甜熔,于是被迫代替她去往敵國和親圆恤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 文件上傳 (一)文件上傳的概述 一腔稀、什么是文件上傳 文件上傳:...
    李霜_9191閱讀 361評論 0 0
  • 文件上傳 (一)文件上傳的概述 一盆昙、什么是文件上傳 文件上傳:將本地的文件通過流寫入到服務(wù)器的過程 二、為什么...
    小湯源O閱讀 209評論 0 0
  • 文件上傳 (一)文件上傳的概述 一焊虏、什么是文件上傳 文件上傳:將本地的文件通過流寫入到服務(wù)器的過程 二淡喜、為什么...
    劉哲_1d91閱讀 178評論 0 0
  • 文件上傳 (一)文件上傳的概述 一、什么是文件上傳 文件上傳:將本地的文件通過流寫入到服務(wù)器的過程 二诵闭、為什么...
    董宇浩閱讀 154評論 0 0
  • 文件上傳 (一)文件上傳的概述 一炼团、什么是文件上傳 文件上傳:將本地的文件通過流寫入到服務(wù)器的過程 二、為什么...
    H_5a8d閱讀 252評論 0 0