Spring MVC的文件上傳


1.文件上傳

文件上傳是項目開發中常用的功能。為了能上傳文件,必須將表單的method設置為POST,並將enctype設置為multipart/form-data。只有在這種情況下,瀏覽器才會把用戶選擇的文件二進制數據發送給服務器。

Spring MVC為文件上傳提供了直接的支持,這種支持是用即插即用的MultipartResolver實現的。Spring MVC使用Apache Commons fileupload技術實現了一個MultipartResolver實現類:CommonsMultipartResolver.所以Spring MVC的文件上傳依賴Apache Commons fileupload的組件。

2.MultipartFile

Spring MVC會將上傳文件綁定到MultipartFile對象中,該對象提供了獲取上傳文件內容,文件名等方法。通過transferTo()方法還可以將文件存儲到硬件中。

MultipartFile常用方法如下:

*bye[] getBytes()  :獲取文件數據

*String getContentType()  :獲取文件MIME類型

*InputStream getIputStream()  :獲取文件流

*String getName()  :獲取表單中文件組件的名字

*String getOriginalFilename()  :獲取上傳文件的原名

*boolean isEmpty()  :是否有上傳的文件

*void transferTo(File dest)  :將文件保存到一個目標文件中

3.實例

3.1創建一個項目,導入相應的jar包,包括Apache的Commons FileUpload的jar包

3.2編寫web.xml和springmvc-config.xml

 

    <!-- 配置前端控制器 -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc-config.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

 

<!-- spring可以自動去掃描base-package下面的包或者子包下面的java類 如果掃描到有spring相關注解的類,則吧這個類注冊為spring的bean -->
    <context:component-scan base-package="com.dj.controller" />
    <!-- 配置MultipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上傳文件大小限制,單位為字節-10Mb -->
        <property name="maxUploadSize">
            <value>10485760</value>
        </property>
        <!-- 請求的編碼格式 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>
    <!-- 默認裝配 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 視圖解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix">
            <value>/</value>
        </property>
        <!-- 后綴 -->
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

3.3編寫一個上傳文件的實體類

private String username;
    //對應上傳文件的file,類型為multipartfile,上傳文件會自動綁定到image屬性中
private MultipartFile image;

3.3編寫controller

@Controller
public class FileUploadController {

    /**
     * 動態跳轉頁面
     * @param pagename
     * @return
     */
    @RequestMapping(value="/{pagename}")
    public String toPage(@PathVariable String pagename){
        return pagename;
    }
    
    @RequestMapping(value="regist")
    public String regist(HttpServletRequest request,
            @ModelAttribute User user,Model model) throws Exception, IOException{
        if(!user.getImage().isEmpty()){
            //文件上傳路徑
            String path = request.getServletContext().getRealPath("/images/");
            //上傳文件名
            String filename = user.getImage().getOriginalFilename();
            File filepath = new File(path, filename);
            //判斷路徑是否存在
            if(!filepath.getParentFile().exists()){
                filepath.getParentFile().mkdirs();
            }
            //將上傳文件保存到一個目標文件中
            user.getImage().transferTo(new File(path+File.separator+filename));
            model.addAttribute("user", user);
            return "userinfo";
        }
                return "error";
        
    }
}

3.4編寫注冊頁面和顯示信息頁面

<form action="regist" method="post" enctype="multipart/form-data">
    用戶名:<input type="text" name="username"/><br>
    請上傳頭像:<input type="file" name="image"><br>
    <input type="submit" vaue="注冊">
</form>
<a href="download?filename=${requestScope.user.image.originalFilename }">
        ${requestScope.user.image.originalFilename }
    </a>

3.5測試

在瀏覽器中輸入如下地址

http://localhost:8888/FileUploadTest/registPage

 

 點擊提交,可以看到

這個文件的保存位置在你工作空間\.metadata\.plugins\org.eclipse.wst.server.core\的一個tmp下的\wtpwebapps\FileUploadTest\images\這個目錄下

你可以在控制台打印保存文件路徑位置再根據路徑去本地找

 

 想看到文件具體位置可以把上傳文件位置改為

user.getImage().transferTo(new File("D:\\"+filename));

這時候就可以在d盤下面看到上傳的文件

 

 源碼下載地址:https://files.cnblogs.com/files/dj-blog/FileUploadTest.zip

 接下來我們再看文件下載:http://www.cnblogs.com/dj-blog/p/7535340.html

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM