### **功能使用**
**假設我們目前有這樣一種場景**
* 我們需要進行文件上傳,前臺返回文件對象,后臺進行文件對象的上傳(上傳到本地按照一定的方式進行分類,文件大小、格式驗證)、數據庫行數據添加、返回前段結果集對應文件信息。
* 而**FileUploadUtil**類就是為了解決這中間的上傳和返回相應結果集而編寫。
**步驟一:前臺傳來文件對象**
* 此時我們后臺需要進行File文件對象的接受,代碼如下:
```
FileUploadUtil fileUploadUtil = FileUploadUtil.getInstance("C:/File/",file);
//首先我們需要創建FileUploadUtil類的對象,此對象不可直接構建對象,必須使用getInstance() 方法進行對象的構建。
//參數1: 文件要上傳到的本地路徑
//參數2: 文件對象
```
**開始上傳**
* 獲取文件對象之后我們只需要執行以下代碼即可進行文件上傳和文件結果集返回
```
fileUploadUtil.start();
//此方法會返回一個File對象,存儲著上傳文件時所上傳文件路徑的File對象
```
自此在文件滿足**FileUploadUtil**默認驗證配置的情況下,就會上傳成功。
### **FileUploadUtil 類上傳默認配置**
* 默認配置有四項,分別為:
```
/**
* 配置類中緩沖區大小屬性
*/
int bufferSize = 400;
/**
* 文件名最大長度
*/
int fileLength = 100;
/**
* 文件最大容量10MB
*/
long fileSize = 10 * 1024 * 1024;
/**
* 允許上傳文件的后綴名
*/
String[] filesuffix = new String[]{"jpg", "png", "ico", "word", "xlsx", "txt", "doc", "docx", "ppt"
,"zip","pdf","rar","html","jpeg"};
```
此四項分別是在文件上傳和文件驗證初的配置。
* 當然此四項,并不能滿足業務的復雜情況,所以**FileUploadUtil**提供了專門的方法進行配置修改:
```
fileUploadUtil.setConfig(300, 20 * 1024 * 1024, 10, new String[]{"JPG","png"});
//注意:此方法一定要放在執行start()方法前,方可有效!
//參數一: 緩沖區大小
//參數二: 文件容量大小
//參數三: 文件名長度大小
//參數四: 允許上傳的文件名后綴格式
```
當然如果必須每次都進行四項全部填寫,有些不需要配置的話,每次就會增加一些麻煩,所以此方法**FileUploadUtil**類提供了三種重載方法,方便大家調用。
```
void setConfig(int bufferSize, int fileSize, int fileLength)
void setConfig(String[] fileSufficx)
void setConfig(int bufferSize, int fileSize, int fileLength, String[] fileSufficx)
//分別為修改 緩沖區大小, 文件大小, 文件名長度
//修改 允許上傳的文件名后綴格式
//修改 全部
```
### **文件重命名操作**
* 如果有這樣的一種業務場景,前端傳入file對象時,帶了一個字符串參數,要實現的功能為上傳之后的文件名為:參數+文件后綴,進行文件的重命名操作。
**FileUploadUtil**類提供了二種細微差距的方法,方便大家調用。
```
fileUploadUtil.setNewName(fileNewName);
//注意:此方法一定要放在執行start()方法前,方可有效!
//此方法為如果參數沒有值就不進行重命名。
//此方法會檢測傳入的參數是否為空,因為可能會存在這么一個情況,前臺帶來文件和newName參數,但是如果參數為空就不重命名,如果不為空再進行重命名的情況,所以我們提供了如果有參數就進行重命名,如果沒有就不進行重命名
fileUploadUtil.setNewNameRow(fileNewName);
//此方法為如果參數沒有值就拋出異常,提醒我們此參數為空。
```
### **FileUploadUtil 類如何對應實體類字段、返回結果集**
* **FileUploadUtil**類里所使用的各種屬性,均可以通過對象.屬性進行訪問
```
fileUploadUtil.afterFileName
fileUploadUtil.fileSuffix....
```
這些屬性會在下面本小節結尾出給出詳細的解釋。
* **FileUploadUtil** 類還給出了兩個方法進行結果集的Map形式返回
```
fileUploadUtil.getMapResult();
fileUploadUtil.getConfigMapResult();
//前者為返回類中使用的屬性(除配置默認屬性)Map形式的結果集
//后綴為配置默認屬性的Map形式的結果集
//如果在start()結束前調用會返回空數據
```
**屬性解釋**
```
/**
* 上傳路徑
*/
String path;
/**
* 配置類中緩沖區大小屬性
*/
int bufferSize = 400;
/**
* 文件名最大長度
*/
int fileLength = 100;
/**
* 文件最大容量10MB
*/
long fileSize = 10 * 1024 * 1024;
/**
* 允許上傳文件的后綴名
*/
String[] filesuffix = new String[]{"jpg", "png", "ico", "word", "xlsx", "txt", "doc", "docx", "ppt"
,"zip","pdf","rar","html","jpeg"};
/**
* MultipartFile對象
*/
MultipartFile multipartFile;
/**
* 文件上傳前的名字
*/
String beforeFileName;
/**
* 文件上傳后的名字
*/
String afterFileName;
/**
* 文件后綴名
*/
String fileSuffix;
/**
* 允許重命名的名字
*/
String fileNewName;
/**
* 拼接成帶文件名的完整路徑方法之后的名字
*/
String afterfileNewName;
/**
* 文件上傳的日期(YYYY-MM-DD)
*/
String uploadFileTime;
/**
* 文件上傳完成之后的絕對路徑名
*/
String fileabsolutePath;
/**
* 文件上傳完成之后的名字不包含后綴
*/
String filenameNotsuffix;
/**
* 是否上傳成功(用來判斷調用getMapResult時是否已經上傳完成,如果沒完成返回空數據)
*/
boolean isSuccess = false;
```
以上都可以在創建對象之后,調用使用,當時建議在start()方法執行完畢之后調用,不然會出現空數據或者默認配置值。
### **FileUploadUtil 類提供的額外兩個工具方法**
* 由于 **FileUploadUtil**類自帶的屬性里并只有文件名、文件后綴、絕對路徑這樣的屬性,當我想要獲取絕對路徑里面的一部分路徑的時候,比如路徑為C:\file\demo\substring 我想要\demo\substring的路徑,這個時候我們可以使用以下兩個方法進行返回字符串。
```
static String getJustBiasFilePath(File file, String split, boolean only)
static String getBackBiasFilePath(File file, String split, boolean only)
示:FileUploadUtil.getBackBiasFilePath(fileStart, "C:/file/", false)
//參數一 :file帶路徑的文件對象,被截取的字符串就從這個file對象的絕對路徑里取
//參數二:要排除的字符串
//參數三:是否第一個字符為斜線
getJustBiasFilePath() 返回正斜線截取文件路徑字符
getBackBiasFilePath() 返回反斜線截取文件路徑字符
```
* 看到這里大家可能不太明白,正斜線,反斜線,only參數在這里的作用是什么?
下文中**正斜線代表 “\”,反斜線代表"/"**
* file對象的絕對路徑返回的路徑斜線全部為正斜線,但是我們知道在java中寫路徑斜線時我們可以`\\ /` 這樣寫,如果參數二寫前者那么是沒有問題,但是后者會出現匹配不到的情況,但是很顯然我們開發者自然是知道這種情況,所有想要是可以匹配到,所以方法內進行處理,匹配的時候,斜線全部為正斜線。
這種情況下返回的結果也就自然是正斜線的,但是有時我們需要反斜線的字符串,這個時候我們就可以
**getBackBiasFilePath**方法來進行反斜線結果的返回。
但是這樣的結果因為這兩個方法的實現過程,所有有些不一樣,如上文的
```
C:\file\demo\substring 路徑
截取 C:\\file\\
這個時候會返回demo\substring,但是它并不是\demo\substring,而有時我們的業務需求恰恰需要怎么一個斜線,所以only為true時,則會加上相應的符合當前字符正反斜線的字符,為false則不添加。
```