在開始之前我們先說下multipart的配置 直接在application.properties進行配置即可 我寫的很清楚了就不說了 這些都是默認值
#單個上傳文件最大
spring.servlet.multipart.max-file-size=1MB
#上傳文件總大小最大
spring.servlet.multipart.max-request-size=10MB
#(零界值)超過零界值就忘硬盤寫 不超過寫內存
spring.servlet.multipart.file-size-threshold=0
#文件很大的話 需要一個臨時文件夾保存文件 然後再寫入硬盤 這就是那個路徑設置
spring.servlet.multipart.location=
我們以上傳img爲例 我們使用@RestController註解哦
開始之前我們先複習幾個servletRequest 的方法
獲取web應用上下文 request.getServletContext()
獲取項目的絕對路徑 getRealPath(String)
一般來說不支持單獨使用getRealPath 我們會使用 request.getServletContext().getRealPath(String)獲取web應用的相對路徑的絕對路徑
我們給我們的文件進行分類 使用時間進行分類會更好一點
那麼我們創建一個現行時間
SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd");
我們設置絕對路徑爲realPath 在這兒我們可以提一個知識點 這是se基礎知識
String lujing=d:\a\\b
使用file.mkdirs創建的話 沒有a不能創建b
使用file.mkdirs創建的話 沒有a我們也可以創建b 那麼a也會被創建
String format = sdf.format(new Date());
String realPath = request.getServletContext().getRealPath("/img") + format;
//文件夾
File folder = new File(realPath);
//如果文件夾不存在那麼我們就創建一下
if(!folder.exists()){
folder.mkdirs();
}
路徑弄完了 我們來設置文件名
我們爲了防止名稱重複使用uuid進行創建 那麼我們設置newName 下面代碼就是se中String的基礎知識了
//獲取傳來的文件名字
String originalFilename = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
下面我們存下文件 然後我們吧路徑返回
try {
//存文件
file.transferTo(new File(folder,newName));
String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "error";
我們解析下下面代碼
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
request.getScheme() 獲取http協議 正常來說返回的是 http
request.getServerName() 獲取我們的訪問ip 本地項目一般是localhost
request.getServerPort() 獲取我們的端口號
最後呢我們可以在html中寫文件上傳控件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>
基本上都是基礎 我們說一下enctype=“multipart/form-data”
這個的意思就是說表單數據有多部分構成,既有文本數據,又有文件等二進制數據的意思。
需要注意的是:默認情況下,enctype的值是application/x-www-form-urlencoded,不能用於文件上傳,只有使用了multipart/form-data,才能完整的傳遞文件數據。
application/x-www-form-urlencoded不是不能上傳文件,是隻能上傳文本格式的文件,multipart/form-data是將文件以二進制的形式上傳,這樣可以實現多種類型的文件上傳。
擴展資料(以下資料來源於網絡):
一、關於HTML 標籤的 enctype 屬性
application/x-www-form-urlencoded:在發送前編碼所有字符(默認)
multipart/form-data: 不對字符編碼,或在使用包含文件上傳控件的表單時,必須使用該值。
text/plain:空格轉換爲 “+” 加號,但不對特殊字符編碼。
二、enctype:規定了form表單在發送到服務器時候編碼方式,有如下的三個值。
1、application/x-www-form-urlencoded。默認的編碼方式。但是在用文本的傳輸和MP3等大型文件的時候,使用這種編碼就顯得 效率低下。
2、multipart/form-data 。 指定傳輸數據爲二進制類型,比如圖片、mp3、文件。
3、text/plain。純7a64e78988e69d8331333366306562文體的傳輸。空格轉換爲 “+” 加號,但不對特殊字符編碼。
下面放下我們全部的java代碼和html代碼
package com.file;
@RestController
public class FilruploadController {
SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd/");
@PostMapping("/upload")
public String file(MultipartFile file, HttpServletRequest request){
String format = sdf.format(new Date());
String realPath = request.getServletContext().getRealPath("/img") + format;
//創建文件夾路徑
File folder = new File(realPath);
//如果文件夾已經不存在那麼我們就創建一下
if(!folder.exists()){
folder.mkdirs();
}
String originalFilename = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
try {
file.transferTo(new File(folder,newName));
String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>