六呐能、springMVC文件上傳下載

文件上傳

apache 上傳組件方案

單文件上傳

  1. 添加依賴

    <!--apache組件文件上傳-->
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>
    
  2. 在springMVC當(dāng)中要注冊一個文件上傳解析器

    <!--文件上傳解析器
        id必須為multipartResolver,原因是源代碼里面寫死了這個名字
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--單個文件最大上傳大小-->
        <property name="maxUploadSizePerFile" value="20000000"></property>
        <!--指定上傳編碼-->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!--定義最大文件大小 總的,單位為bytes-->
        <property name="maxUploadSize" value="200000000"></property>
    </bean>
    
  3. 準(zhǔn)備上傳頁面

    <form action="${ctx}/file/upload" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="file">
        <input type="submit" value="提交">
    </form>
    
  4. 后臺

    @Controller
    @RequestMapping("/file")
    public class FileController {
    
        /*在Windows下的路徑分隔符(\)和在Linux下的路徑分隔符(/)是不一樣的,
            當(dāng)直接使用絕對路徑時携栋,跨平臺會報No Such file or diretory異常。
            File.separator能解決這個問題
        */
        private static String uploadPath = "E:" + File.separator;
    
        //入?yún)⒕涂梢赃x擇上傳的文件
        @RequestMapping("/upload")
        public String upload(@RequestParam("file")MultipartFile multipartFile,Model model){
            //1、傳到那里去 2伴嗡、我傳什么東西 3、傳的細(xì)節(jié)
            System.out.println("uploadPath=" + uploadPath);
            //1从铲、判斷
            if(multipartFile != null && !multipartFile.isEmpty()){
                //不能為空
                //2瘪校、獲取原始的文件名
                String originalFilename = multipartFile.getOriginalFilename();
                System.out.println(originalFilename);
    
                //3、先截取文件的文件名前綴名段,不帶后綴
                String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));
    
                //4阱扬、加工處理文件名,將原文件名+時間戳
                String newFileNamePrefix = fileNamePrefix + new Date().getTime();
    
                //5伸辟、得到新文件名
                String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));
    
                //6麻惶、構(gòu)建文件對象
                File file = new File(uploadPath + newFileName);
    
                //7、上傳操作
                try {
                    multipartFile.transferTo(file);
                    model.addAttribute("fileName",newFileName);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return "uploadSuc";
        }
    }
    

多文件上傳

@RequestMapping("/upload2")
public String upload2(@RequestParam("file")MultipartFile[] multipartFiles,Model model){

    List<String> fileNames = new ArrayList<>();

    if(multipartFiles != null && multipartFiles.length > 0){
        //遍歷
        for(MultipartFile multipartFile : multipartFiles){
            //1信夫、傳到那里去 2窃蹋、我傳什么東西 3、傳的細(xì)節(jié)
            System.out.println("uploadPath=" + uploadPath);
            //1静稻、判斷
            if(multipartFile != null && !multipartFile.isEmpty()){
                //不能為空
                //2警没、獲取原始的文件名
                String originalFilename = multipartFile.getOriginalFilename();
                System.out.println(originalFilename);

                //3、先截取文件的文件名前綴振湾,不帶后綴
                String fileNamePrefix = originalFilename.substring(0,originalFilename.lastIndexOf("."));

                //4杀迹、加工處理文件名,將原文件名+時間戳
                String newFileNamePrefix = fileNamePrefix + new Date().getTime();

                //5押搪、得到新文件名
                String newFileName = newFileNamePrefix + originalFilename.substring(originalFilename.lastIndexOf("."));

                //6树酪、構(gòu)建文件對象
                File file = new File(uploadPath + newFileName);

                //7浅碾、上傳操作
                try {
                    multipartFile.transferTo(file);
                    fileNames.add(newFileName);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    model.addAttribute("fileNames",fileNames);

    return "uploadSuc2";
}

servlet3.0 文件上傳

springmvc中的bean改成

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean>

bean里面的屬性只能在web.xml中寫或者使用全注解開發(fā)模式

xml文件

  <servlet>
    <!--
        這里的servlet-name是有講究的,
        如果我們不去修改spring配置文件默認(rèn)的位置嗅回,
        那么springmvc它會去WEB-INF下面找一個叫做springmvc-servlet.xml的文件
    -->
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--可以重命名springmvc的文件名-->
      <param-name>namespace</param-name>
      <param-value>springmvc-servlet</param-value>
    </init-param>
    <init-param>
      <!--用來制定上下文的位置-->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
      <!--需要加上這一行-->
    <multipart-config>
      <max-file-size>200000000</max-file-size>
      <max-request-size>2000000000</max-request-size>
    </multipart-config>
  </servlet>

文件下載

普通方法下載

@RequestMapping("/down2")
public String down2(HttpServletResponse response){
    java.io.BufferedInputStream bis = null;
    java.io.BufferedOutputStream bos = null;

    String filename = "1.jpg";

    String downLoadPath = parentPath + filename;  //注意不同系統(tǒng)的分隔符
    // String downLoadPath =filePath.replaceAll("/", "\\\\\\\\");   //replace replaceAll區(qū)別 *****
    System.out.println(downLoadPath);

    try {
        long fileLength = new File(downLoadPath).length();
        response.setContentType("application/x-msdownload;");
        response.setHeader("Content-disposition", "attachment; filename=" + new String(filename.getBytes("utf-8"), "ISO8859-1"));
        response.setHeader("Content-Length", String.valueOf(fileLength));
        bis = new BufferedInputStream(new FileInputStream(downLoadPath));
        bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buff = new byte[2048];
        int bytesRead;
        while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff, 0, bytesRead);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bis != null)
            try {
                bis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        if (bos != null)
            try {
                bos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    return null;
}

使用spring自帶的ResponseEntity進(jìn)行下載

@RequestMapping("/down3")
public ResponseEntity<byte[]> export() throws IOException {

    String filename = "1.jpg";
    HttpHeaders headers = new HttpHeaders();
    File file = new File(parentPath + filename);
    if(file.exists()){
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", filename);

        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                headers, HttpStatus.CREATED);
    }else{
        System.out.println(filename+" no exists");
        return null;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末及穗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绵载,更是在濱河造成了極大的恐慌埂陆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃豹,死亡現(xiàn)場離奇詭異焚虱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鹃栽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躯畴,你說我怎么就攤上這事民鼓。” “怎么了蓬抄?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵丰嘉,是天一觀的道長。 經(jīng)常有香客問我嚷缭,道長饮亏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任阅爽,我火速辦了婚禮路幸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘付翁。我一直安慰自己简肴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布百侧。 她就那樣靜靜地躺著着帽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪移层。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天赫粥,我揣著相機(jī)與錄音观话,去河邊找鬼。 笑死越平,一個胖子當(dāng)著我的面吹牛频蛔,可吹牛的內(nèi)容都是我干的灵迫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼晦溪,長吁一口氣:“原來是場噩夢啊……” “哼瀑粥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起三圆,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狞换,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舟肉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體修噪,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年路媚,在試婚紗的時候發(fā)現(xiàn)自己被綠了黄琼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡整慎,死狀恐怖脏款,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裤园,我是刑警寧澤撤师,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站比然,受9級特大地震影響丈氓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜强法,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一万俗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饮怯,春花似錦闰歪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至论矾,卻和暖如春教翩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贪壳。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工饱亿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓彪笼,卻偏偏與公主長得像钻注,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子配猫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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