【SpringMVC學習筆記】—— 【四】文件上傳

👉 原文首發: 小牛肉的個人博客,歡迎來訪~



一、傳統方式的文件上傳

傳統方式的文件上傳,指的是我們上傳的文件和訪問的應用存在於同一臺服務器上。 並且上傳完成之後,瀏覽器可能跳轉。

1. 導入依賴

  <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>

2. Jsp界面

<form action="/fileupload" method="post" enctype="multipart/form-data">
        <input type="file" name = "upload"/>
        <br/>
        <input type="submit" value="上傳文件">
</form>

3. Controller控制器

//控制器類
@Controller
public class FileController {

    @RequestMapping("/fileupload")
    public String fileupload(HttpServletRequest request) throws Exception {
        // 先獲取到要上傳的文件目錄
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        // 創建File對象,一會向該路徑下上傳文件
        File file = new File(realPath);
        // 判斷路徑是否存在,如果不存在,創建該路徑
        if(!file.exists()){
            file.mkdirs();
        }
        // 創建磁盤文件項工廠
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        // 解析request對象
        List<FileItem> list = servletFileUpload.parseRequest(request);
        // 遍歷
        for(FileItem fileItem : list){
            // 判斷文件項是普通字段,還是上傳的文件
            if(fileItem.isFormField()){

            }
            // 上傳文件項
            else{
                // 獲取到上傳文件的名稱
                String filname = fileItem.getName();
                // 上傳文件
                fileItem.write(new File(file,filname));
                // 刪除臨時文件
                fileItem.delete();
            }
        }
        return "success";
    }
}

4. 運行結果

文件會上傳到 target 目錄下的 uploads 文件夾
在這裏插入圖片描述

二、 SpringMVC傳統方式的文件上傳

同樣需要導入上一步的pom依賴文件

原理如下:
在這裏插入圖片描述

1. 配置文件解析器

springmvc.xml

 <!-- 配置文件上傳解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 設置上傳文件的最大尺寸爲 5MB -->
            <property name="maxUploadSize">   
                <value>5242880</value>
            </property>
    </bean>

注意: 文件上傳的解析器 id是固定的,不能起別的名稱,否則無法實現請求參數的綁定。(不光是文件,其他 字段也將無法綁定)

2. Jsp界面

<form action="/fileUpload2" method="post" enctype="multipart/form-data">
        名稱:<input type="text" name="picname"/><br/>
        圖片:<input type="file" name="uploadFile"/><br/>
        <input type="submit" value=" 上傳 "/> 
    </form>

3. Controller控制器

@RequestMapping("/fileUpload2")
    // 參數picname、uploadFile要和jsp界面的name一致
    public String FileUpload2(String picname, MultipartFile uploadFile, HttpServletRequest request) throws IOException {
        // 1. 定義文件名
        String fileName = "";
        // 獲取原始文件名
        String uploadFileName = uploadFile.getOriginalFilename();
        // 截取文件擴展名
        String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
        // 把文件加上隨機數,防止文件重複
        String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
        // 判斷是否輸入了文件名
        if(!StringUtils.isEmpty(picname)){
            fileName = uuid + "_" + picname + "." + extendName;
        }
        else{
            fileName = uuid + "_" + uploadFileName;
        }
        System.out.println(fileName);

        // 2. 獲取到要上傳的文件目錄
        String realPath = request.getSession().getServletContext().getRealPath("/uploads");
        // 3. 創建File對象,一會向該路徑下上傳文件
        File file = new File(realPath);
        // 判斷路徑是否存在,如果不存在,創建該路徑
        if(!file.exists()){
            file.mkdirs();
        }

        // 4. 使用 MulitpartFile 接口中方法,把上傳的文件寫到指定位置
        uploadFile.transferTo(new File(file, fileName));
        return "success";
    }

4. 運行結果

在這裏插入圖片描述

在這裏插入圖片描述

三、SpringMVC跨服務器方式的文件上傳

在這裏插入圖片描述
此處我們用兩個 Tomcat 服務器模擬應用服務器和圖片服務器

1. 新建一個Tomcat服務器存儲圖片

新建一個 fileuploadserver web工程
在這裏插入圖片描述
在webapp 下創建uploads文件夾用來存儲圖片
在這裏插入圖片描述
同時需要在target目錄下創建uploads文件夾(這一步很重要,不做的話會報409錯誤)
在這裏插入圖片描述
Tomcat 服務器配置,注意修改端口號
在這裏插入圖片描述
在這裏插入圖片描述

還需要在web.xml中修改serlvet權限,servlet默認權限是隻讀 (這步不做會報405錯誤)

<web-app>

  <display-name>Archetype Created Web Application</display-name>

  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>readonly</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
</web-app>

org.apache.catalina.servlets.DefaultServlet 會爆紅,不用理會,我們只需要能夠修改權限就可以了

OK,至此,圖片服務器 fileupload 的配置完畢,接下來開始應用服務器 springmvc 的配置和代碼編寫

2. 導入依賴

<dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    
    <dependency>
      <groupId>com.sun.jersey</groupId>            
      <artifactId>jersey-client</artifactId>            
      <version>1.18.1</version>        
    </dependency>

3. Jsp界面

<form action="/fileUpload3" method="post" enctype="multipart/form-data">
        圖片:<input type="file" name="uploadFile"/><br/>
        <input type="submit" value=" 上傳 "/>
</form>

4. Controller控制器

 @RequestMapping(value = "/fileUpload3")
    // 參數picname、uploadFile要和jsp界面的name一致
    public String FileUpload3(MultipartFile uploadFile) throws IOException {
        System.out.println("SpringMVC跨服務器方式的文件上傳......");
        //定義圖片服務器的請求路徑
        String path = "http://localhost:9090/uploads/";
        //獲取到上傳文件的名稱
        String filename = uploadFile.getOriginalFilename();
        // 把文件加上隨機數,防止文件重複
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        // 文件名稱唯一化
        filename = uuid + "_" + filename;

        //向圖片服務器上傳文件
        // 1. 創建客戶端對象
        Client client = Client.create();
        // 2. 連接圖片服務器
        WebResource resource = client.resource(path + filename);
        // 3. 上傳文件
        resource.put(uploadFile.getBytes());

        return "success";
    }

5. 運行結果

最終圖片保存在 圖片服務器 的 target 文件夾下的 uploads 中
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章