SpringBoot系列(九)分分鐘解決文件上傳html
往期推薦
SpringBoot系列(一)idea新建Springboot項目前端
SpringBoot系列(四)web靜態資源配置詳解spring
SpringBoot系列(五)Mybatis整合完整詳細版後端
SpringBoot系列(六)集成thymeleaf詳解版跨域
Springboot系列(七) 集成接口文檔swagger,使用,測試數組
SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式瀏覽器
咱們直接建立一個包含web依賴的項目就行了。
而後須要在配置文件配置文件上傳的一些設置。這裏使用yml文件做爲配置文件,若是不懂語法的,請移步前面的系列三,裏面有詳細解釋。app
server: port: 8095 spring: servlet: multipart: max-file-size: 10MB max-request-size: 30MB
默認大小爲1MB
除了能夠用配置文件配置還可利用java配置,以下
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //上傳的單個文件最大值 KB,MB 這裏設置爲10MB DataSize maxSize = DataSize.ofMegabytes(10); DataSize requestMaxSize = DataSize.ofMegabytes(30); factory.setMaxFileSize(maxSize); /// 設置一次上傳文件的總大小 factory.setMaxRequestSize(requestMaxSize); return factory.createMultipartConfig(); }
這個方法能夠放在啓動類裏面,也能夠本身放置在一個配置類裏面,讓項目啓動的時候能正常加載就行。
單文件上傳,咱們須要用後端接受並將文件存儲到項目裏面或者是本身定義路徑。這裏以圖片做爲上傳的文件。而且將文件上傳到項目裏面。
@RestController @RequestMapping("/file") public class FileController { @PostMapping("/uploadFile") public String uploadFile(MultipartFile file, HttpServletRequest request) { if (file.isEmpty()){ return "上傳的文件不能爲空!請從新上傳"; } if (file.getSize()<=0){ return "上傳的文件大小須要大於0kb"; } System.out.println(file.getContentType());//image/png Date date = new Date(); Long time = date.getTime(); String originFileName = file.getOriginalFilename();//獲取文件原始的名稱 String newFileName = time+originFileName; //獲取項目運行的絕對路徑 String filePath = System.getProperty("user.dir"); //因爲我是建立的多模塊項目,因此獲取到的項目運行路徑爲外層的項目路徑, // 這時候咱們就須要在項目相對路徑這裏加上項目的名稱demo-upload String newFilePath = filePath+"\\demo-upload\\src\\main\\resources\\static\\images\\"; //固然你也能夠本身設置一個絕對路徑用於圖片上傳,文件上傳。 //好比說:D:\\images\\ File file1 = new File(newFilePath); if (!file1.exists()){ file1.mkdirs(); } FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(newFilePath+newFileName); fileOutputStream.write(file.getBytes()); fileOutputStream.flush(); fileOutputStream.close(); return "localhost:8095/images/"+newFileName; } catch (java.io.IOException e) { e.printStackTrace(); } return "上傳失敗"; } }
代碼說明:
在代碼裏,咱們能夠利用參數file來判斷這個文件是否爲空,或者將這個文件的後綴名拿出來,判斷這個文件的類型是否符合咱們的要求,利用getContentType() 方法,若是你是上傳的png圖片,那麼打印出來的就是image/png 其餘類型的圖片就是其餘類型。咱們爲了區分圖片,能夠利用當前時間的getTime方法得到的數字來做爲圖片的前綴,也能夠用其餘的數字或者字符串。都不想說了,碼字太累了。接下來獲取當前項目運行的路徑,因爲我是建立的多模塊項目,因此這個獲取的路徑須要再加上項目名稱,後面加上咱們須要上傳的文件存儲的位置,通常在resources文件下面。而後判斷這個存儲文件的文件夾是否存在,若是不存在就須要建立一個文件。而後利用字節流,將數據寫到文件中,返回可訪問的路徑。
前端代碼,我直接在static目錄下面建立了一個upload.html文件,而後咱們在文件裏面寫入一下內容
<p>單文件上傳</p> <form action="/file/uploadFile" method="POST" enctype="multipart/form-data"> 文件:<input type="file" name="file"/> <input type="submit" /> </form>
它的action對應了咱們controller裏面訪問上傳文件的對應的方法的路徑,method屬性是post,與後端一致。type爲file的input框的name屬性須要與controller裏面的接受對象MultipartFile 一致,若是不一致的話後端沒法接受到數據。若是你已經寫好後端,而前端後端參數不一致,你能夠給後端參數加上一個註解。@RequestParam("file") 這個註解放在MultipartFile的前面,這樣即便你的參數名字不是file,也能正確接受到數據。
將文件上傳以後,那個返回的路徑應該是不能直接訪問到圖片的,會顯示404,咱們需能夠添加如下配置。
@Configuration public class ResourceConfigAdapter implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //獲取文件的真實路徑 String path = System.getProperty("user.dir")+"\\demo-upload\\src\\main\\resources\\static\\images\\"; String os = System.getProperty("os.name"); if (os.toLowerCase().startsWith("win")) { registry.addResourceHandler("/images/**"). addResourceLocations("file:" + path); } } }
這裏的java動態配置比利用的yml的配置更靈活,在知道文件要存儲的位置的狀況下,能夠本身在yml文件裏面加配置。而後咱們運行項目,以下:
上傳一張圖片,返回可訪問的路徑
而後咱們將這個URL複製到瀏覽器,運行,就能訪問圖片了。
這是單文件上傳,而後可能你須要作多文件上傳,很簡單,後端作一個循環就好了,而後利用MultipartFile的數組接受文件,對前端作一點修改。
@PostMapping("/uploadFiles") public String uploadFiles(MultipartFile[] files,HttpServletRequest request) { StringBuilder paths = new StringBuilder(); for (MultipartFile file:files) { //中間的代碼和上面的同樣 try { //這裏根據實際狀況修改,能夠用數組 paths.append("localhost:8095/images/"+newFileName+"\n"); } catch (java.io.IOException e) { e.printStackTrace(); } } return paths.toString(); }
前端稍微修改一下
<p>多文件上傳</p> <form action="/file/uploadFiles" method="POST" enctype="multipart/form-data"> 文件:<input type="file" name="files" multiple="multiple"/> <input type="submit"/> </form>
這就完成了多文件的上傳,在上傳的時候你須要按住Ctrl鍵,而後選中多個文件,就能上傳了。
本文講解了單文件,多文件上傳,而後對文件的上傳限制條件與訪問添加了一些配置。若是你以爲本文對你有用,點個贊表示一下。