1. 程式人生 > >myBatis + SpringMVC上傳和下載檔案

myBatis + SpringMVC上傳和下載檔案

環境:maven+SpringMVC + Spring + MyBatis + MySql

首先要建立資料庫,此處使用MySql資料庫。
第一步:

匯入commons-fileupload-1.3.1.jar和commons-io-2.4.jar以及SpringMVC與Mybatis的整合jar包
注意:文中給出的程式碼多為節選重要片段,並不齊全。

第二步:

在applicationContext.xml中配置檔案上傳的bean
    <!-- 配置檔案上傳 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
>
<property name="maxUploadSize"> <!-- 最大上傳大小:5M --> <value>5242880</value> </property> </bean>

單檔案上傳
注意:Html中form表單的型別

index.jsp

<!-- 由於上傳檔案,資料型別是複合型別,所以enctype="multipart/form-data -->
    單檔案上傳<br/><br
/>
<form action="/springmvc_mybatis_test12_upload/test_upload.action" method="post" enctype="multipart/form-data"> <input type="file" name="multipartFile"> <input type="submit" value="上傳"> </form>
控制器Upload_Download.java
//單檔案上傳,引數必須是MultipartFile型別,用來接收上傳的檔案
@RequestMapping("test_upload.action") public String test_upload(MultipartFile multipartFile) throws Exception{ if(!multipartFile.isEmpty()){ //檔案上傳的儲存路徑 String path="F:\\"; //圖片的原始名稱(不含路徑) String origanlFileName = multipartFile.getOriginalFilename(); //上傳的圖片的儲存的新名稱,隨機生成檔名稱+.jpg String newFileName = UUID.randomUUID()+origanlFileName.substring(origanlFileName.lastIndexOf(".")); File file = new File(path+newFileName); //將記憶體的資料寫到磁碟上 multipartFile.transferTo(file); } return "/WEB-INF/jsp/success.jsp"; }

多檔案上傳

index.jsp

        <form action="/springmvc_mybatis_test12_upload/test_uploadMoreFile.action" method="post" enctype="multipart/form-data">
            <!-- 上傳多個檔案,用List<MultipartFile> pic接收 -->
            <input type="file" name="pic[0]"><br/><br/>
            <input type="file" name="pic[1]"><br/><br/>
            <input type="file" name="pic[2]"><br/><br/>
            <input type="file" name="pic[3]"><br/><br/>
            <input type="submit" value="多檔案上傳">
        </form>
單檔案上傳時,Controller方法中的引數是MultipartFile型別接收上傳的檔案的資訊,多檔案上傳時,可以自定義包裝類將MultipartFile型別進行包裝

MultipartFiles.java

/*
 * 上傳多個檔案,每個檔案都用Controller方法中的MultipartFiles型別的形參接收,所以自定義pojo包裝類
 * */
public class MultipartFiles {
    private List<MultipartFile> pic;//用List接收,每個檔案對應一個MultipartFile

    public List<MultipartFile> getPic() {
        return pic;
    }

    public void setPic(List<MultipartFile> pic) {
        this.pic = pic;
    }

}

Upload_Download.java

    //多檔案上傳,MultipartFiles是自定義包裝類,用List<MultipartFile>接收
    @RequestMapping("/test_uploadMoreFile.action")
    public String test_uploadMoreFile(MultipartFiles multipartFiles) throws Exception{

        List<MultipartFile> list = multipartFiles.getPic(); //得到上傳的檔案連結串列
        for(MultipartFile multipartFile:list){
                     if(!multipartFile.isEmpty()){
                        //上傳圖片的儲存路徑
            String path = "F:\\";
            //圖片的原始名稱(不含路徑)
            String origanlFileName = multipartFile.getOriginalFilename();
            //新圖片的名稱,隨機生成檔名稱+.jpg
            String newFileName =                     UUID.randomUUID()+origanlFileName.substring(origanlFileName.lastIndexOf("."));
            //新圖片
            File file = new File(path+newFileName);
            //將記憶體中的資料寫入磁碟
            multipartFile.transferTo(file);
                    }

        }
        return "/WEB-INF/jsp/success.jsp";
    }

檔案下載
Upload_Download.java

//檔案下載
    //請求<a href="/springmvc_mybatis_test12_upload/test_download.action?filename=趙奕歡.jpg">點選下載資源</a>
    @RequestMapping("/test_download.action")
    //String filename 是請求引數
    public String test_download(HttpServletRequest request,HttpServletResponse response,String filename) throws Exception{

        filename = new String(filename.getBytes("iso-8859-1"),"UTF-8");//get提交,修改編碼

        String path = request.getRealPath("/WEB-INF/picture/"+filename);//得到資源在硬碟上的絕對的路徑    
        File file = new File(path);
        response.setCharacterEncoding("UTF-8");
        filename = URLEncoder.encode(filename, "UTF-8");//將中文轉為瀏覽器可認識的編碼
        response.setHeader("content-disposition", "attachment;filename="+filename);//設定響應頭為檔案下載
        response.setContentLength((int)file.length());
        int len = 0;
        byte []buffer = new byte[1024];
        InputStream is = new FileInputStream(file);
        OutputStream os= response.getOutputStream();//向瀏覽器寫資料
        while((len = is.read(buffer)) != -1){
            os.write(buffer,0,len);
        }
        is.close();
        os.close();
        return null;    //一定要返回null,執行後不跳轉
    }