3辩恼、文件上傳

首先application.yml配置項如下

multipart:
  enabled: true
  file-size-threshold: 30MB
  max-file-size: -1

具體參數(shù)說明如下:
(1) multipart.enabled
開啟分段(multi-part)上傳支持选侨。(默認值: true锐想。)
(2)multipart.file-size-threshold
大于該閾值的文件會寫到磁盤上。這里的值可以使用MB或KB后綴來表明是兆字節(jié)還是千字節(jié)旺订。(默認值: 0。)
(3)multipart.location
上傳文件的中間存放位置超燃。
(4)multipart.max-file-size
最大文件大小区拳。這里的值可以使用MB或KB后綴來表明是兆字節(jié)還是千字節(jié)。(默認值:1MB意乓。-1表示無限制)
(5)multipart.max-request-size
最大請求大小樱调。這里的值可以使用MB或KB后綴來表明是兆字節(jié)還是千字節(jié)。(默認值:10MB届良。)

pom.xml需要加入

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency> 

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>

前端

<form id="edit-profile" class="form-horizontal" action="<%=basePath %>upload/beforeUploadExcel" 
method="post" enctype="multipart/form-data"/>
    <div class="control-group">
        <label class="control-label" for="username">文件</label>
        <div class="controls">
            <input type="file" name="file" class="input-medium disabled"/>
            <p class="help-block"></p>
        </div>
    </div>
    <br />
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">下一步</button>
        <button class="btn">取消</button>
    </div>
</form>

controlller

@RequestMapping(value = "/beforeUploadExcel", method = RequestMethod.POST)
public String beforeUploadExcel(MultipartHttpServletRequest multiReq, Map<String, Object> model) {
    // 從session中獲取用戶信息
    User userLogin = (User) session.getAttribute(SessionKeyConstant.USER_INFO);
    
    // 獲取上傳的文件MultipartFile
    MultipartFile uploadFile = multiReq.getFile("file");
    String fileNameAll = multiReq.getFile("file").getOriginalFilename();
    String fileName = fileNameAll.substring(0, fileNameAll.lastIndexOf("."));
    // 獲取上傳文件名的后綴
    String fileSuffix = fileNameAll.substring(fileNameAll.lastIndexOf("."));
    logger.info("上傳文件全名:" + fileNameAll);
    logger.info("上傳文件名:" + fileName);
    logger.info("文件后綴名:" + fileSuffix);
    
    // 如果文件為空
    if (uploadFile == null) {
        model.put(PageCodeEnum.KEY, PageCodeEnum.FILEISNULL);
        return "/selectfile";
    } else if(!fileNameAll.endsWith("xlsx") && !fileNameAll.endsWith("xls")) {
        // 文件格式不對
        model.put(PageCodeEnum.KEY, PageCodeEnum.FILEILLEGAL);
        return "/selectfile";
    } else if(!fileService.hasRightName(fileNameAll, userLogin.getUserid())) {
        // 文件名不包含項目名
        model.put(PageCodeEnum.KEY, PageCodeEnum.FILENAMEISWRONG);
        return "/selectfile";
    } else {
        // 判斷該用戶是否有映射關系笆凌,如果存在,返回usersheetList
        List<UserSheet> userSheetList = uploadService.hasMapping(userLogin.getUserid(), fileName);
        session.setAttribute(userLogin.getUserid() + ReturnConstant.USER_SHEET_LIST_LAST, userSheetList);
        
        // 文件保存到本地
        File commonFile = fileService.saveExcel(multiReq, userLogin);
        // 獲取sheet頁名字
        Map<String, List<String>> sheetTitleUpload = ExcelUtil.readSheetTitle(commonFile);
        logger.info("用戶上傳的sheetTitleUpload:" + sheetTitleUpload);
        session.setAttribute(userLogin.getUserid() + SessionKeyConstant.USER_SHEET_TITLE_UPLOAD, sheetTitleUpload);
        return "/selectsheet";
    }
}

service:存儲文件到本地

/**
 * 把文件保存到 resources目錄下士葫,并返回File對象
 * @param multiReq
 * @return
 */
public File saveExcel(MultipartHttpServletRequest multiReq, User user) {
    String fileNameAll = multiReq.getFile("file").getOriginalFilename();
    String fileName = fileNameAll.substring(0, fileNameAll.lastIndexOf("."));
    logger.info("上傳文件名為:" + fileName);
    String path = FileService.class.getResource("/").getPath().substring(1);
    // 創(chuàng)建一個以用戶名為名字的文件夾
    File pathFile = new File(path + user.getName());
    pathFile.mkdir();
    File saveFile = new File(path + user.getName() + "/" + fileNameAll);
    ByteArrayInputStream inputStream = null;
    FileOutputStream outputStream = null;
    try {
        inputStream = (ByteArrayInputStream) multiReq.getFile("file").getInputStream();
        // 文件寫到resources目錄下
        outputStream = new FileOutputStream(saveFile);
        byte[] temp = new byte[1024];
        int i = inputStream.read(temp);
        while (i != -1) {
            outputStream.write(temp, 0, temp.length);
            outputStream.flush();
            i = inputStream.read(temp);
        }
        // 存到session
        session.setAttribute(user.getUserid() + SessionKeyConstant.FILENAME, fileName);
        session.setAttribute(user.getUserid() + SessionKeyConstant.SAVEFILE, saveFile);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return saveFile;
}

說明:如果沒用spring boot乞而,做文件上傳報錯:[org.springframework.web.multipart.MultipartException: The current request is not a multipart request]
可在spring-mvc.xml中添加

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

參考:https://stackoverflow.com/questions/15008049/org-springframework-web-multipart-multipartexception-the-current-request-is-not

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慢显,隨后出現(xiàn)的幾起案子爪模,更是在濱河造成了極大的恐慌欠啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋灌,死亡現(xiàn)場離奇詭異洁段,居然都是意外死亡,警方通過查閱死者的電腦和手機共郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門祠丝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人除嘹,你說我怎么就攤上這事纽疟。” “怎么了憾赁?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵污朽,是天一觀的道長。 經(jīng)常有香客問我龙考,道長蟆肆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任晦款,我火速辦了婚禮炎功,結果婚禮上,老公的妹妹穿的比我還像新娘缓溅。我一直安慰自己蛇损,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布坛怪。 她就那樣靜靜地躺著淤齐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袜匿。 梳的紋絲不亂的頭發(fā)上更啄,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音居灯,去河邊找鬼祭务。 笑死,一個胖子當著我的面吹牛怪嫌,可吹牛的內容都是我干的义锥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岩灭,長吁一口氣:“原來是場噩夢啊……” “哼拌倍!你這毒婦竟也來了?” 一聲冷哼從身側響起川背,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤贰拿,失蹤者是張志新(化名)和其女友劉穎蛤袒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膨更,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡妙真,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荚守。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珍德。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矗漾,靈堂內的尸體忽然破棺而出锈候,到底是詐尸還是另有隱情,我是刑警寧澤敞贡,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布泵琳,位于F島的核電站,受9級特大地震影響誊役,放射性物質發(fā)生泄漏获列。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蛔垢、第九天 我趴在偏房一處隱蔽的房頂上張望击孩。 院中可真熱鬧,春花似錦鹏漆、人聲如沸巩梢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括蝠。三九已至,卻和暖如春板驳,著一層夾襖步出監(jiān)牢的瞬間又跛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工若治, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人感混。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓端幼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弧满。 傳聞我的和親對象是個殘疾皇子婆跑,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容