首頁 > 軟體

SpringMVC實現上傳下載檔案

2022-09-06 18:07:02

本文範例為大家分享了SpringMVC實現上傳下載檔案的具體程式碼,供大家參考,具體內容如下

一、SpringMVC專門提供了CommonsMultipartResolver元件用於檔案上傳:

(1)maxUploadSize 檔案最大限制,單位是byte
(2)maxInMemorySize 低於這個大小的檔案暫存記憶體中
(3)defaultEncoding 預設編碼utf-8

必須在spring-mvc.xml檔案

<!-- (2)設定 MultipartResolver 實現檔案上傳  
                  注意:id="multipartResolver"是固定寫法
       -->
       <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
         <!-- 字元編碼 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- max size 10M -->
        <property name="maxUploadSize" value="10485760000"/>
        <!--記憶體中最大 4K  -->
        <property name="maxInMemorySize" value="4096"/>
       </bean>

二、SpringMVC檔案上傳引入jar包 

 

必須在設定Pom.xml檔案

<!-- fileupload start -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
 
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
 
        <!-- end -->

三、實現【單個檔案】上傳

(1)JSP頁面必須放在WEB-INF下 upload1.jsp 必須新增enctype="multipart/form-data" 

<body>
    <div style="margin: 0 auto; margin-top: 100px; background:snow">
        <form method="post" action="upload1.html" name="form1"
            enctype="multipart/form-data">
            <p>
                  照片:<input type="file" name="imagefile">
                <input type="submit" value="上傳" name="button1"> <br>
            </p>
        </form>
    </div>

 (2) 寫控制類 UploadController.java

@Controller
public class UploadController {
 
    @RequestMapping("upload1")
    public String getUpload(@RequestParam("imagefile") MultipartFile imagefile,
            HttpServletRequest request) {
        // 獲取上傳的伺服器路徑
        String pathString = request.getSession().getServletContext().getRealPath("/upload/");
        // 獲取檔案
        String fileName = imagefile.getOriginalFilename();
        
        System.out.println(fileName);
 
        // 判斷上傳的路徑是否存在
        File file = new File(pathString);
        if (!file.exists()) {
            file.mkdirs();
        }
 
        System.out.println("上傳路徑=" + pathString +"/"+ fileName);
        // 檔案不存在
        File targetFile = new File(pathString +"/"+ fileName);
        if (!targetFile.exists()) {
            try {
                targetFile.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
 
        try {
            // 上傳
            imagefile.transferTo(targetFile);
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        //注意:/springmvc5/WEB-INF/jsp/http:/localhost:8888/springmvc5/upload/1.gif.jsp
        //返回檔案,必須是重定向檔案
        return "redirect:http://localhost:8888/springmvc5/upload/" + fileName;
 
    } }

(3)效果

選擇圖片路徑:

單擊上傳:

四、實現【多個檔案】上傳

(1)JSP頁面(必須放在WEB-INF下) upload2.jsp  必須新增enctype="multipart/form-data" 

<body>
    <div style="margin: 0 auto; margin-top: 100px; background:snow">
        <form method="post" action="upload2.html" name="form1"
            enctype="multipart/form-data">
            <p>
                  照片1:<input type="file" name="imagefile1"><p/>
                  照片2:<input type="file" name="imagefile2"><p/>
                <input type="submit" value="上傳" name="button1"> <br>
            </p>
        </form>
    </div>
</body>

 (2) 寫控制類 UploadController.java

@RequestMapping("upload2")
    public String getUpload2(HttpServletRequest request) {
 
        // 多檔案上傳
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        // 獲得多個檔案
        Map<String, MultipartFile> map = multipartRequest.getFileMap();
 
        // 獲取上傳的伺服器路徑
        String pathString = request.getSession().getServletContext().getRealPath("/upload/");
        // 判斷上傳的路徑是否存在
        File file1 = new File(pathString);
        if (!file1.exists()) {
            file1.mkdirs();
        }
 
        // 獲取檔案
        List<String> list = new ArrayList<String>();
 
        // 遍歷資料
        for (MultipartFile file : map.values()) {
            String fileName = file.getOriginalFilename();
            System.out.println("上傳路徑=" + pathString +"/"+ fileName);
            // 檔案不存在
            File targetFile = new File(pathString  +"/"+ fileName);
            if (!targetFile.exists()) {
                try {
                    targetFile.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
 
            try {
                // 上傳
                file.transferTo(targetFile);
 
                // 儲存路徑
                list.add("http://localhost:8888/springmvc5/upload/" + fileName);
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
 
        }
        // 儲存每個上傳的路徑
        request.setAttribute("files", list);
        
        return "showUpload";   //跳轉到showUpload.jsp頁面哦!
 
    }

注意:return "showUpload";是具體顯示的頁面;必須設定檢視解析器在spring-mvc.xml檔案中

<!--(1) spring 檢視解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"  p:suffix=".jsp"></bean>

(3)JSP頁面: showUpload.jsp

<div style="margin: 0 auto; margin-top: 100px; background:snow">
      <%
        List<String> list =(List<String>) request.getAttribute("files");
        
        for(String str:list){
      
       %>
          <a href="<%=str%>" rel="external nofollow" ><img src="<%=str%>" alt=""/></a>
       
       <%} %>
</div>

(4)效果

單擊上傳:

檢視上傳到伺服器的圖片

五、下載圖片

 (1)JSP頁面 login.jsp

<a href="download.html?fileName=08.gif" >下載圖片</a><p/>

 (2)控制類DownController

@Controller
public class DownController {
 
    @RequestMapping("/download")
    public String download(@RequestParam String fileName,
            HttpServletRequest request, HttpServletResponse response) {
 
        // 設定響應編碼
        response.setContentType("text/html;charset=utf-8");
 
        // 設定請求編碼
        try {
            request.setCharacterEncoding("utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
        // 位元組流
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
 
        // 獲取伺服器的路徑
        String path = request.getSession().getServletContext().getRealPath("/upload/");
 
        // 下載的路徑
        String downPath = path +"/"+ fileName;
 
        try {
            // 檔案大小
            long fileSize = new File(downPath).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(fileSize));
            //位元組流
            bis = new BufferedInputStream(new FileInputStream(downPath));
            bos= new BufferedOutputStream(response.getOutputStream());
            //位元組陣列
            byte[] by = new byte[2048];
            
            //
            int length=0;
            
            //讀取
            while((length=bis.read(by,0,by.length))!=-1){
                //寫入
                bos.write(by, 0, length);
                
            }
            
        } catch (Exception e) {
            // TODO: handle exception
            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;
 
    }
}

(3)效果

儲存或開啟如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com