天天看點

Spring MVC 檔案上傳 和下載下傳

一、搭建Spring開發環境

1.1 在web.xml 中配置Servlet

<!--配置MVC中央控制器:DispatcherServlet-->
 <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化一些參數 init-->
    <!--指定Spring配置檔案的路徑-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--容器在啟動時就加載Servlet-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--設定此Servlet截獲并處理所有的URL請求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>
           

1.2 springmvc-config.xml:

<context:component-scan base-package="com.ytzl.controller"/>
<context:component-scan base-package="com.ytzl.service"/>
<!--2、開啟mvc注解驅動:自動注冊生成兩個工具:處理器映射器(HandleMapping)和處理器擴充卡(HandleAdapter)-->
<mvc:annotation-driven/>
<!--配置視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsp/"/><!--字首-->
    <property name="suffix" value=".jsp"/><!--字尾-->
</bean>



<!--配置全局異常捕獲-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
     <props>
         <prop key="java.lang.RuntimeException">error</prop>
     </props>
    </property>
</bean>
<!--配置檔案上傳-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--上傳檔案的最大大小-->
    <property name="maxUploadSize" value="17367648787"></property>
   <!--傳檔案的編碼 -->
    <property name="defaultEncoding" value="UTF-8"></property>
</bean>
           

二、建立頁面

2.2建立fileUpdate.jsp 頁面 需要注意的是form 表單 要加上 屬性entcypt=“multipart/form-data”,這表示上傳的将會是二進制流的格式,以規定的二進制進行上傳,便于伺服器處理,使用post請求:
<form action="FileUpdate" enctype="multipart/form-data" method="post">
    <table>
        <tr>
            <td>請選擇檔案:</td>
            <td><input type="file" name="file"></td>
        </tr>
        <tr>
            <td>開始上傳</td>
            <td><input type="submit" value="上傳"></td>
        </tr>
    </table>
</form>
</body>
           
2.2:再寫一個上傳成功的jsp頁面,主要是用來當上傳成功時候跳轉的頁面,命名為:success.jsp
<body>
   <h2>檔案上傳成功!</h2>  
  </body>
           

2.3:然後再寫一個上傳失敗的頁面,主要是用來當上傳失敗的時候跳轉的頁面,命名為:error.jsp

<body>
<h2>檔案上傳失敗!請檢查檔案是否存在</h2>
</body>
           

2.3:建立控制器 SpringMVC 控制器

//檔案上傳
    @RequestMapping(value = "/FileUpdate", method = RequestMethod.POST)
    public String fileUpdate(@RequestParam("file") MultipartFile file, HttpServletRequest request) {

        if (!file.isEmpty()) {

            String contextPath = request.getContextPath();//"/SpringMvcFileUpload"  項目路徑
            String servletPath = request.getServletPath();//"/gotoAction"   本次請求的路徑
            String scheme = request.getScheme();//"http"  //協定

            String storePath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//存放我們上傳的檔案路徑

            String fileName = file.getOriginalFilename();

            File filepath = new File(storePath, fileName);  // 檔案的寫入的路徑

            if (!filepath.getParentFile().exists()) {

                filepath.getParentFile().mkdirs();//如果目錄不存在,建立目錄
            }

            try {

//                file.transferTo(new File(storePath + File.separator + fileName));//把檔案寫入目标檔案位址
                file.transferTo(new File(String.valueOf(filepath)));//把檔案寫入目标檔案位址

            } catch (Exception e) {

                e.printStackTrace();

                return "error";
            }
            return "success";//傳回到成功頁面

        } else {
            return "error";//傳回到失敗的頁面
        }

    }
           
2.5:好了,到此我們就可以實作上傳功能了,釋出在Tomact容器裡,然後就可以進行上傳檔案了。在浏覽中輸入:自己伺服器 部署 的 項目路徑 具體的頁面請求如下,然後浏覽具體的檔案,點選上傳按鈕:
Spring MVC 檔案上傳 和下載下傳

上傳成功!

Spring MVC 檔案上傳 和下載下傳

三、檔案下載下傳 , 将檔案綁定到具體的對象上 首先定義 一個實體類 private MultipartFile file; 這個 對象主要用于 綁定 上傳的檔案

package com.ytzl.pojo;

import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;

public class UserFrom implements Serializable {
    private String uname; // 與請求參數名稱相同
    private String upass;
    private String reupass;
    private MultipartFile file;  //上傳檔案會自動綁定到該屬性
    //省略 getre seter 方法  ......
           
3.2建立一個 register.jsp 頁面 用于模拟使用者 注冊上傳頭像的 場景 如下
<form action="${pageContext.request.contextPath }/register" method="post"  enctype="multipart/form-data" >
    <table border=1 bgcolor="lightblue" align="center">
        <tr><td>姓名:</td><td><input class="textSize" type="text" name="uname" /></td></tr>
        <tr><td>密碼:</td><td><input class="textSize" type="password" maxlength="20" name="upass" /></td></tr>
        <tr><td>确認密碼:</td><td><input class="textSize" type="password" maxlength="20" name="reupass" /></td></tr>
        <tr><td>請選擇頭像:</td><td><input type="file" name="file"></td></tr>
        <tr><td>開始上傳</td><td><input type="submit" value="上傳"></td></tr>
    </table>
</form>
</body>
           

3.3:寫我們的方法控制器處理注冊邏輯的層的代碼,注意其中的user對象加入了@ModelAttribute注解,其主要作用是用來映射把上面的form表單的file屬性自動注入到對象裡面,還有Map<String,Object>

map主要是為了存放user對象,放在requestScope裡面,這樣就可用el表達式把其中的值取出來了。

//檔案下載下傳-檔案上傳
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute UserFrom user, HttpServletRequest request, Map<String, Object> map) {
    MultipartFile file = user.getFile();
    boolean empty = file.isEmpty();
    String wrong = "success";
    String good = "download";
    if (!empty) {
        String realPath = request.getServletContext().getRealPath("/images");
        String uploadPath = "E:\\project\\SpringMvcFileUpload\\WebRoot\\images";
        String headimageName = file.getOriginalFilename();
        File imageFile = new File(uploadPath, headimageName);
        try {
            file.transferTo(new File(uploadPath + File.separator + headimageName));
        } catch (IOException e) {
            e.printStackTrace();
            return wrong;
        }
        map.put("user", user);
        return good;
    } else {
        return wrong;
    }
}
           
3.4 我們再建立一個 download.jsp 頁面 用來 下載下傳我們 模拟注冊 上傳後的檔案
<body>
	使用者頭像:${user.file.originalFilename} // requestScope 這裡 是可以不用寫 的 他預設會從小到大 在域裡找user
	</body>
           
Spring MVC 檔案上傳 和下載下傳
Spring MVC 檔案上傳 和下載下傳

四、實作使用者下載下傳 功能 改造 我們的 download.jsp

<body>
<p>${requestScope.user.file}</p>
<h3>檔案下載下傳</h3>
<p>使用者頭像:<a href="download?filename=${requestScope.user.file.originalFilename}">下載下傳:${requestScope.user.file.originalFilename}</a></p>
</body>
           
4.2 然後 開始 編寫 download 控制器 注意download方法傳回的是ResponseEntity<byte[]> 類型,這個是封裝好的傳回類型,我們需要傳入byte數組、headers、HttpStatus,然後它就會傳回具體的下載下傳流,調用用戶端去下載下傳資源
//檔案下載下傳
@RequestMapping(value = "download", method = RequestMethod.GET)
public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws IOException {

    String downloadFilePath="E:\\project\\SpringMvcFileUpload\\WebRoot\\images";//從我們的上傳檔案夾中去取

    File file = new File(downloadFilePath+File.separator+filename);//建立一個檔案

    HttpHeaders headers = new HttpHeaders();//http頭資訊

    String downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1");//設定編碼

    headers.setContentDispositionFormData("attachment", downloadFileName);

    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

    //MediaType:網際網路媒介類型  contentType:具體請求中的媒體類型資訊

    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
           

頁面頂部的 語句 忽略

Spring MVC 檔案上傳 和下載下傳
4.3 開始測試

點選 開始下載下傳

如圖左下角 的 下載下傳完成 去檢視 控制器 下載下傳路徑的位置 檔案就已經在了

Spring MVC 檔案上傳 和下載下傳

本篇博文介紹了SpringMvc上傳和檔案的功能,需要注意的地方就是對于檔案上傳包common-fileupload.jar包的使用,還有在配置檔案上配置mulitipartResolver這個bean。下面又介紹了用java 實體類去映射上傳檔案的屬性對應的檔案,這點的好處就是它會自動映射,然後把對象放入到我們的請求域中,就可以展示給界面使用者層,這也是mvc思想模式的展現。接下來是介紹去下載下傳檔案,隻需要從我們的寫入的目标位址去取出檔案,再進行responseEntity對象的封裝,就可以實作下載下傳功能

參考自 :https://www.cnblogs.com/wyq178/p/6921164.html