文件上傳

跟著書(shū)上的例子寫(xiě)了個(gè)文件上傳的簡(jiǎn)單頁(yè)面狂丝,感覺(jué)還蠻有意思的

前端

要上傳文件救斑,必須利用multipart/form-data設(shè)置HTML表單的enctype屬性。

<form action="action" method="post" enctype="multipart/form-data">
    Select a file <input type="file" name="fieldName" /> 這個(gè)fieldName必須設(shè)置

服務(wù)器端

通過(guò)MultipartConfig注解類型和javax.servlet.http.Part接口進(jìn)行處理真屯,處理上傳文件的Servlet必須用@MultipartConfig進(jìn)行標(biāo)注
MultipartConfig有以下可選屬性

  1. maxFileSize脸候,表示最多可上傳的文件容量,默認(rèn)值-1绑蔫。
  2. maxRequestSize运沦,表示允許多部分HTTP請(qǐng)求的最大容量,默認(rèn)值為-1
  3. location配深,指定上傳的文件保存到磁盤(pán)中的指定位置
  4. fileSizeThreshold携添,設(shè)定一個(gè)溢出尺寸,超過(guò)這個(gè)值的文件將被臨時(shí)存儲(chǔ)在磁盤(pán)

HttpServletRequest 接口定義了以下方法來(lái)處理多部分的請(qǐng)求

  1. Part getPart(String name)篓叶,返回與指定名稱相關(guān)的Part烈掠,這個(gè)name與前端頁(yè)面中input的name相同。
  2. Collection<Part> getParts()缸托,返回所有Part
  3. String getContentType()左敌,如果Part是一個(gè)文件,返回Part的內(nèi)容類型俐镐,否則返回null
  4. Collection<String> getHeaderNames()矫限,返回這個(gè)Part中的所有header名稱
  5. void write(String path),將文件寫(xiě)入指定的路徑
  6. void delete()佩抹,刪除該文件對(duì)應(yīng)的存儲(chǔ)叼风,包括相關(guān)的臨時(shí)文件
  7. InputStream getInputStream(),以流形式返回上傳文件的內(nèi)容

域的形式

如果上傳域中有一個(gè)名為document的note.txt文件時(shí)棍苹,產(chǎn)生的header

content-type:text/plain
content-disposition:form-data; name="document"; filename="note.txt"

如果是一個(gè)非文件的域无宿,Part將只有content-disposition的header
格式:content-disposition:form-data; name="fiedlName"

范例

@WebServlet(urlPatterns = "/singleUpload")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 3, maxFileSize = 1024 * 1024 * 10)
public class UploadFileServlet extends HttpServlet {

    private static final long serialVersionUID = 8593039L;

    /**
     * 從Part中提取文件名
     * @param part
     * @return
     */
    private String getFileName(Part part) {
        String contentDispositionHeader = part.getHeader("content-disposition");
        String[] elements = contentDispositionHeader.split(";");
        for (String element : elements) {
            if (element.trim().startsWith("filename")) {
                return element.substring(element.indexOf('=') + 1).trim().replace("\"", "");
            }
        }

        return null;
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part = req.getPart("filename");
        String filename = getFileName(part);
        
        if (filename != null && !filename.isEmpty()) { //檢測(cè)文件名是否合法
            
            // 在WEB-INF目錄下創(chuàng)建/tmp/upload/文件夾,將上傳文件存儲(chǔ)到這個(gè)文件夾下
            // WEB-INF目錄下的文件是無(wú)法通過(guò)鏈接直接訪問(wèn)的
            File f = new File(getServletContext().getRealPath("/WEB-INF") + "/tmp/upload/");
            if (!f.exists()) {
                f.mkdirs();
            }
            
            // 將文件寫(xiě)入
            part.write(getServletContext().getRealPath("/WEB-INF") + "/tmp/upload/" + filename);

        }

        
        // 返回文件的名字廊勃,大小懈贺,上傳者等信息
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.print("<br/>Upload file name: " + filename);
        writer.print("<br/>Size: " + part.getSize());

        String author = req.getParameter("author");
        writer.print("<br/>Author: " + author);
        writer.close();
    }

}

再來(lái)看下前端頁(yè)面singleUpload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Select a file to upload</h1>
    <form action="singleUpload" enctype="multipart/form-data", method="post">
        Author: <input type="text" name="author" /><br/>
        <!-- 這里name的值“filename”在獲取Part對(duì)象時(shí)使用 -->
        Select file to upload <input type="file" name="filename" /> <br/>
        <input type="submit" value="Upload">
    </form>
</body>
</html>
頁(yè)面

點(diǎn)擊上傳就可以在配置的文件夾下看到自己上傳的文件了。

總結(jié)

這篇博客只是實(shí)現(xiàn)了一個(gè)很簡(jiǎn)單的文件上傳坡垫,算是給自己的后端之路挖下第一個(gè)坑(???)一直感覺(jué)后端很高大上梭灿,第一次動(dòng)手寫(xiě)東西果然高大上hhhhh,Android里沒(méi)怎么使用到的注解啊冰悠,文件堡妒,IO流都在這里得到了較多使用,很神奇的感覺(jué)(手動(dòng)捂臉)溉卓。希望能慢慢學(xué)點(diǎn)后端知識(shí)吧皮迟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搬泥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伏尼,更是在濱河造成了極大的恐慌忿檩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆阶,死亡現(xiàn)場(chǎng)離奇詭異燥透,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)辨图,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)班套,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人故河,你說(shuō)我怎么就攤上這事吱韭。” “怎么了鱼的?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵理盆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鸳吸,道長(zhǎng)熏挎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任晌砾,我火速辦了婚禮坎拐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘养匈。我一直安慰自己哼勇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布呕乎。 她就那樣靜靜地躺著积担,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猬仁。 梳的紋絲不亂的頭發(fā)上帝璧,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音湿刽,去河邊找鬼的烁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诈闺,可吹牛的內(nèi)容都是我干的渴庆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起那槽,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痪欲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年老客,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震叮。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳍鸵,靈堂內(nèi)的尸體忽然破棺而出苇瓣,到底是詐尸還是另有隱情,我是刑警寧澤偿乖,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布击罪,位于F島的核電站,受9級(jí)特大地震影響贪薪,放射性物質(zhì)發(fā)生泄漏媳禁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一画切、第九天 我趴在偏房一處隱蔽的房頂上張望竣稽。 院中可真熱鬧,春花似錦霍弹、人聲如沸毫别。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岛宦。三九已至,卻和暖如春耍缴,著一層夾襖步出監(jiān)牢的瞬間砾肺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工防嗡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留变汪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓本鸣,卻偏偏與公主長(zhǎng)得像疫衩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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

  • 本文包括:1闷煤、文件上傳概述2童芹、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,531評(píng)論 5 91
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理鲤拿,服務(wù)發(fā)現(xiàn)假褪,斷路器,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 一、文件上傳概述 實(shí)現(xiàn)web開(kāi)發(fā)中的文件上傳功能窒升,需完成如下二步操作在web頁(yè)面中添加上傳輸入項(xiàng)在servlet中...
    yjaal閱讀 2,885評(píng)論 0 22
  • 文件上傳 文件上傳是一個(gè)常用的功能缀遍。同時(shí)也是非常難以掌握的一個(gè)技術(shù)部分。這篇文章從前后端兩個(gè)部分來(lái)分析要完成一個(gè)文...
    LeoMelody閱讀 41,513評(píng)論 1 7
  • 近日饱须,讀完《卓有成效的管理者》域醇,收獲了15個(gè)道理。 1蓉媳、 管理者所做的工作必須要有效譬挚,即按時(shí)做完該做的事。 2酪呻、 ...
    品牌張閱讀 571評(píng)論 0 0