Spring Boot文件上傳和下載


  1. Spring Boot 文件上傳

   1.1 創建springboot項目,引入webthymeleaf啟動器坐標

 

 

   1.2 編寫文件上傳的視圖層thymeleaf頁面。index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上傳和下載的頁面</title>
</head>
<body>
    <form th:action="@{/fileUpload}" method="post" enctype="multipart/form-data">
        文件上傳:<input type="file" name="file" />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

   1.3 編寫訪問thymeleaf頁面的控制器方法

      由於template目錄是安全目錄,該目錄下所有的thymeleaf頁面都不能直接訪問,必須通過控制器才能訪問。

@Controller
public class FileUpDownController {

    @RequestMapping("/{page}")
    public String path(@PathVariable String page){
        return page;
    }
}

1.4 編寫實現控制文件上傳的控制器方法

/**
 * 實現文件上傳
 * @param file 上傳的文件對象
 */
@RequestMapping("/fileUpload")
@ResponseBody
public String fileUpload(MultipartFile file){
    try {
        //path:目標目錄
        File path=new File("src/main/resources/static/files");
        if(!path.exists()){
            path.mkdirs();
        }
        String oldName=file.getOriginalFilename();
        String fileName= UUID.randomUUID().toString().substring(0,18)+oldName.substring(oldName.lastIndexOf("."));
        //descFile:目標目錄=文件夾名+文件名
        File descFile=new File(path.getAbsolutePath()+"/"+fileName);
        //將上傳的文件保存到指定的目標目錄下
        file.transferTo(descFile);
        return "文件上傳成功";
    } catch (IOException e) {
        e.printStackTrace();
        return "文件上傳失敗";
    }
}

 1.5文件上傳配置,全局配置文件application.properties

      默認spring boot 文件上傳單個文件的大小為1MB

       默認spring boot 文件上傳總文件的大小為10MB

#配置單個文件的最大大小
spring.servlet.multipart.max-file-size=20MB
#設置文件的總大小
spring.servlet.multipart.max-request-size=100MB

 

  1. Spring Boot 文件下載

   2.1 頁面部分

<a th:href="@{/downLoad(filename='417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg')}" >下載417f0b50-8dec-4b77-8a9c-73ff4a2b4cf9.jpg</a>
<a th:href="@{/downLoad(filename='27e8460b-1e75-4a16.sql')}" >下載sql</a>

  2.2 控制器實現文件下載

/**
 * 文件下載
 */
@RequestMapping("/downLoad")
public void downLoad(String filename, HttpServletResponse response){
    try {
        //根據文件名,找到目標目錄下的文件
        File file=new File("src/main/resources/static/files/"+filename);
        //設置響應頭,以附件的形式下載
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
        //將目標文件復制一份,通過response以流的形式輸出
        IOUtils.copy(new FileInputStream(file),response.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

  1. Spring Boot 實現跨服務器文件上傳

   3.1 結構圖

 

 

 

   3.2 創建文件服務器mavenweb項目,存放上傳的文件服務器

      項目名:fileupload_server

 

 

 

     在項目的webapp目錄下,創建一個files的目錄,存放上傳的文件

      注意:往files中先默認放一張圖片,否則files文件編譯后不會保留

 

 

 

     項目發布到tomcat服務器上,並啟動。注意修改端口和jmx

 

 

 

   3.3 創建實現文件上傳的服務器,實現跨服務器文件上傳的代碼

       3.3.1 打開pom.xml文件,引入跨服務器的坐標

<!--跨服務器文件上傳,引入jersey的相關坐標-->
<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.3.2 頁面核心代碼

<form th:action="@{/fileUpload2}" method="post" enctype="multipart/form-data">
    文件上傳:<input type="file" name="file" />
    <input type="submit" value="提交" />
</form>

      3.3.3 application.properties配置文件

#上傳的服務器的目標地址
server.file.path=http://localhost:9090/fileupload_server/files/

      3.3.4 控制器核心代碼

@Value("${server.file.path}")
String path;
/**跨服務器的文件上傳*/
@RequestMapping("/fileUpload2")
@ResponseBody
public String fileUpload2(MultipartFile file) throws IOException {
    System.out.println("跨服務器文件上傳");
    //文件名
    String fileName=file.getOriginalFilename();
    //創建客戶端對象
    Client client=Client.create();
    //和圖片服務器建立連接
    WebResource webResource=client.resource(path+fileName);
    //上傳文件到圖片服務器
    webResource.put(file.getBytes());
    return "文件上傳成功!";
}

3.3.4 測試,發現出現報錯

 

  原因:

只要我們關聯了服務器地址之后就可以直接通過put方法把文件上傳上去,這無疑是非常危險的行為。因為在上傳過程中並沒有進行用戶校驗,那么如果被人知道了服務器保存圖片的路徑,甚至不需要知道准確路徑,只要知道服務器ip地址就夠了,那么他就可以通過put方法無限量的進行服務器上傳。

如果開啟了put方法,那么就可以任意寫寫入文件到服務器。但是如果禁用了put方法,那么又有導致一些需要put方法的業務無法使用.

修改tomcat的配置。修改在tomcat的/conf目錄下的web.xml。找到下面這段把readonly設置成true。這樣就無法通過put往服務器中寫入文件了.

    解決:修改tomcatweb.xml文件設置為允許讀寫

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


免責聲明!

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



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