文件上傳和下載


如果表單里面包括上傳文件的 input 標(biāo)簽 這個(gè)時(shí)候就不能用beanUtils


1暂氯、文件上傳的原理分析

1.1文件上傳的必要前提:
a侣滩、提供form表單证逻,method必須是post
b、form表單的enctype必須是multipart/form-data
c找筝、提供input type="file"類的上傳輸入域
注意:文件上傳不能以String傳輸 以字節(jié)流形式傳輸(圖片)

1.2enctype屬性
作用:告知服務(wù)器請求正文的MIME類型。(請求消息頭:Content-Type作用是一致的)
可選值:
application/x-www-form-urlencoded(默認(rèn)):
正文:name=admin&password=123
服務(wù)器獲取數(shù)據(jù):String name = request.getParameter("name");
multipart/form-data:


image.png

服務(wù)器獲取數(shù)據(jù):request.getParameter(String)方法獲取指定的表單字段字符內(nèi)容慷吊,但文件上傳表單已經(jīng)不在是字符內(nèi)容袖裕,而是字節(jié)內(nèi)容,所以失效罢浇。

2陆赋、借助第三方的上傳組件實(shí)現(xiàn)文件上傳
2.1 fileupload概述
fileupload是由apache的commons組件提供的上傳組件沐祷。它最主要的工作就是幫我們解析request.getInputStream()。
導(dǎo)入commons-fileupload相關(guān)jar包
commons-fileupload.jar攒岛,核心包赖临;
commons-io.jar,依賴包灾锯。

2.2 fileupload的核心類有:
DiskFileItemFactory兢榨、ServletFileUpload、FileItem顺饮。
a吵聪、解析原理


image.png

2.3 fileupload簡單應(yīng)用
使用fileupload組件的步驟如下:
1.創(chuàng)建工廠類DiskFileItemFactory對象:
DiskFileItemFactory factory = new DiskFileItemFactory()
2.使用工廠創(chuàng)建解析器對象:
ServletFileUpload fileUpload = new ServletFileUpload(factory)

3.使用解析器來解析request對象:
List<FileItem> list = fileUpload.parseRequest(request)
FileItem對象對應(yīng)一個(gè)表單項(xiàng)(表單字段)〖嫘郏可以是文件字段或普通字段
boolean isFormField():判斷當(dāng)前表單字段是否為普通文本字段吟逝,如果返回false,說明是文件字段赦肋;
String getFieldName():獲取字段名稱块攒,例如:<input type=”text” name=”username”/>,返回的是username佃乘;
String getString():獲取字段的內(nèi)容囱井,如果是文件字段,那么獲取的是文件內(nèi)容趣避,當(dāng)然上傳的文件必須是文本文件庞呕;
String getName():獲取文件字段的文件名稱;(a.txt 101.jpg)
String getContentType():獲取上傳的文件的MIME類型程帕,例如:text/plain住练。
int getSize():獲取上傳文件的大小骆捧;
InputStream getInputStream():獲取上傳文件對應(yīng)的輸入流澎羞;
void write(File):把上傳的文件保存到指定文件中。
delete();**

4敛苇、文件上傳時(shí)要考慮的幾個(gè)問題(經(jīng)驗(yàn)分享)
a妆绞、保證服務(wù)器的安全
把保存上傳文件的目錄放在用戶直接訪問不到的地方。


image.png

b枫攀、避免文件被覆蓋
讓文件名唯一即可


image.png

c括饶、避免同一個(gè)文件夾中的文件過多
方案一:按照日期進(jìn)行打散存儲(chǔ)目錄


image.png

方案二:用文件名的hashCode計(jì)算打散的存儲(chǔ)目錄:二級目錄


image.png

d、限制文件的大欣凑恰:web方式不適合上傳大的文件
單個(gè)文件大型佳妗:
ServletFileUpload.setFileSizeMax(字節(jié))
總文件大小:(多文件上傳)
ServletFileUpload.setSizeMax(字節(jié))

e蹦掐、上傳字段用戶沒有上傳的問題
通過判斷文件名是否為空即可

f技羔、臨時(shí)文件的問題
DiskFileItemFactory:
作用:產(chǎn)生FileItem對象
內(nèi)部有一個(gè)緩存僵闯,緩存大小默認(rèn)是10Kb。如果上傳的文件超過10Kb藤滥,用磁盤作為緩存鳖粟。
存放緩存文件的目錄在哪里?默認(rèn)是系統(tǒng)的臨時(shí)目錄拙绊。
FileItem.write(File)
如果自己用IO流實(shí)現(xiàn)的文件上傳向图,要在流關(guān)閉后,清理臨時(shí)文件标沪。
FileItem.delete();

setHeaderEncoding方法:由于瀏覽器在提交FORM表單時(shí)榄攀,會(huì)將普通表單中填寫的文本內(nèi)容傳遞給服務(wù)器,對于文件上傳字段金句,除了傳遞原始的文件內(nèi)容外檩赢,還要傳遞其文件路徑名等信息。如果在使用Apache文件上傳組件時(shí)遇到了中文字符的亂碼問題趴梢,一般都是沒有正確調(diào)用setHeaderEncoding方法的原因漠畜。
一般在Servlet中使用如下設(shè)置:

servletFileUpload.setHeaderEncoding("utf-8");

getName方法用于獲得文件上傳字段中的文件名,如果FileItem類對象對應(yīng)的是普通的表單字段坞靶,getName方法將返回null,即使用戶沒有通過網(wǎng)頁表單中的文件字段傳遞任何文件蝴悉,但只要設(shè)置了文件表單字段的name屬性彰阴,瀏覽器也會(huì)將文件字段的信息傳遞給服務(wù)器,只是文件名和文件內(nèi)容部分都為空拍冠,但這個(gè)表單字段仍然對應(yīng)一個(gè)FileItem對象尿这,此時(shí)getName方法返回結(jié)果為”“字符串,這一部分在使用的時(shí)候需要注意一下庆杜。值得注意的是射众,如果用戶使用windows系統(tǒng)上傳文件,瀏覽器將傳遞該文件的完整路徑晃财;如果使用linux或Unix系統(tǒng)上傳文件叨橱,瀏覽器將只傳遞該文件的名稱部分。

使用方式如下所示:
當(dāng)我們要選取非文件字段的文本值的時(shí)候 需要用如下的寫法:

image.png

本文主要借鑒 https://blog.csdn.net/gaoying_blogs/article/details/64919204
以及 https://blog.csdn.net/soft_xiaohui/article/details/5904785 這兩篇文章断盛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗洗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钢猛,更是在濱河造成了極大的恐慌伙菜,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命迈,死亡現(xiàn)場離奇詭異贩绕,居然都是意外死亡火的,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門淑倾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卫玖,“玉大人,你說我怎么就攤上這事踊淳〖偎玻” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵迂尝,是天一觀的道長脱茉。 經(jīng)常有香客問我,道長垄开,這世上最難降的妖魔是什么琴许? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溉躲,結(jié)果婚禮上榜田,老公的妹妹穿的比我還像新娘。我一直安慰自己锻梳,他們只是感情好箭券,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疑枯,像睡著了一般辩块。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荆永,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天废亭,我揣著相機(jī)與錄音,去河邊找鬼具钥。 笑死豆村,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骂删。 我是一名探鬼主播掌动,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桃漾!你這毒婦竟也來了坏匪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤撬统,失蹤者是張志新(化名)和其女友劉穎适滓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恋追,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凭迹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年罚屋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅绸。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脾猛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鱼鸠,到底是詐尸還是另有隱情猛拴,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布蚀狰,位于F島的核電站愉昆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麻蹋。R本人自食惡果不足惜跛溉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扮授。 院中可真熱鬧芳室,春花似錦、人聲如沸刹勃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽深夯。三九已至抖格,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咕晋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工收奔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掌呜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓坪哄,卻偏偏與公主長得像质蕉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子翩肌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • 一念祭、文件上傳概述 實(shí)現(xiàn)web開發(fā)中的文件上傳功能兑宇,需完成如下二步操作在web頁面中添加上傳輸入項(xiàng)在servlet中...
    yjaal閱讀 2,880評論 0 22
  • 本文包括:1、文件上傳概述2粱坤、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3隶糕、核心API——Dis...
    廖少少閱讀 12,517評論 5 91
  • 文件上傳 表單準(zhǔn)備要想使用 HTML 表單上傳一個(gè)或多個(gè)文件須把 HTML 表單的 enctype 屬性設(shè)置為 m...
    MPPC閱讀 737評論 0 8
  • 文件上傳和下載的實(shí)質(zhì):文件的拷貝 文件上傳:從本地拷貝到服務(wù)器磁盤上 客戶端需要編寫文件上傳表單---->服務(wù)...
    小閆94閱讀 277評論 0 0
  • J姐要離職了。 那個(gè)三年前將我們招進(jìn)公司的美女面試官再登,職業(yè)尔邓、干練、優(yōu)雅锉矢,儼然成為我們當(dāng)年新員工的職場偶像梯嗽。經(jīng)過轉(zhuǎn)崗...
    泋小溪閱讀 682評論 0 3