### **功能使用**
**假设我们目前有这样一种场景**
* 我们需要进行文件上传,前台返回文件对象,后台进行文件对象的上传(上传到本地按照一定的方式进行分类,文件大小、格式验证)、数据库行数据添加、返回前段结果集对应文件信息。
* 而**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则不添加。
```