- Spring Boot 文件上傳
1.1 創建springboot項目,引入web和thymeleaf啟動器坐標
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 |
- 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(); } } |
- Spring Boot 實現跨服務器文件上傳
3.1 結構圖
3.2 創建文件服務器,maven的web項目,存放上傳的文件服務器
項目名: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往服務器中寫入文件了. |
解決:修改tomcat的web.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> |