# common-file
**Repository Path**: xiaomao2541864996/common-file
## Basic Information
- **Project Name**: common-file
- **Description**: 文件上传、三方文件上传、本地上传、七牛、阿里云、UFile、腾讯云
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2022-01-25
- **Last Updated**: 2024-06-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 快速上手
#### 第一步:下载项目
> 将common-file-core模块导入自己项目
#### 第二步:引入Maven
```maven
com.wxm
common-file-core
1.0.0
```
#### 第三步:实现上传配置Service[UploadConfigService]
```java
@Service
public class UploadConfigServiceImpl implements UploadConfigService {
/**
* 这里具体指定使用的是那个供应商的上传
* @param T
* @return UploadBaseProperty
*/
@Override
public UploadBaseProperty getFileSupplierProperty() {
LocalOssProperty localOssProperty = new LocalOssProperty();
localOssProperty.setStoreAddress("E:/");
localOssProperty.setRootPath("E:/");
return localOssProperty;
}
/**
* 配置文件[最大上传额度]
* @return
*/
@Override
public UploadConfigVo getUploadConfigVo() {
UploadConfigVo uploadConfigVo = new UploadConfigVo();
uploadConfigVo.setMaxSize(100 * 1024L); //最大上传
uploadConfigVo.setRenTag(YesNoConstant.YES);//开启重命名
return uploadConfigVo;
}
/**
* 文件上传成功后的操作 可以将上传记录进行保存
* @return Consumer
*/
@Override
public Consumer uploadAfter() {
return item -> {
log.info("文件上传成功: {}",item.getAccessPath());
};
}
/**
* 文件删除成功后的操作 可以将上传记录进行删除
* @return Consumer
*/
@Override
public Consumer deleteAfter() {
return item ->{
log.info("文件删除成功: {}",item.getAccessPath());
};
}
/**
* 是否开启文件MD5校验
* @return boolean
*/
@Override
public boolean checkFileMd5() {
//开启MD5校验
return true;
}
/**
* 开启MD5后会走这个方法 进行数据库查询,如果查询到相同MD5的文件返回文件的访问路径 后面就直接返回不在进行上传
* @param nowFileMd5 上传文件的MD5
* @return 如果返回空串或NULL会继续上传 否则上传结束[将当前方法返回的访问路径进行返回]
*/
@Override
public String doCheckFileMd5(String nowFileMd5) {
log.info("比对文件MD5信息: {}",nowFileMd5);
return "E:/模拟MD5对比成功返回旧的文件URL";
}
/**
* MD5eq后相同之后走的方法 可以进行更新上传时间
* @return Consumer
*/
@Override
public Consumer md5EqAfter() {
return item ->{
log.info("MD5文件比对成功: {} 更新上传时间",item);
};
}
}
```
#### 第四步:使用上传类进行上传
> UploadFileResult upload = imgUploadService.upload(0,file);
>
> UploadFileResult upload = imgUploadService.upload(0,file,"A","B");
### 拓展上传的供应商
#### 1.加入供应商配置类 继承 UploadBaseProperty
> fileSupplierEnum() : 获取供应商类型
>
> supplierService() : 获取供应商的实现
>
```java
public class LocalOssProperty extends UploadBaseProperty{
@Override
public FileSupplierEnum fileSupplierEnum() {
return FileSupplierEnum.LOCAL;//绑定的供应商枚举
}
@Override
public LocalOssProperty uploadProperty() {
return this;//当前配置
}
@Override
public Class extends SupplierBaseService> supplierService() {
return LocalOssService.class;//绑定的上传实现Service
}
}
```
#### 2.加入供应商枚举 FileSupplierEnum
> type : 供应商标识[不可重复]
>
> name : 供应商名称
>
> clazz : 供应商配置类 即上方继承UploadBaseProperty的实体类
#### 3.加入供应商上传的实现类 继承 SupplierBaseService
> init() : 用于初始化一些配置信息
>
> uploading() : 流上传
>
> delete() : 删除
```java
public class LocalOssService implements SupplierBaseService{
private LocalOssProperty localOssProperty;
@Override
public void init(UploadBaseProperty> uploadBaseProperty) {
//初始化操作
this.localOssProperty = (LocalOssProperty) uploadBaseProperty;
}
@Override
public String uploading(InputStream inputStream, String fileName) throws Exception {
//流上传
}
@Override
public void delete(String filePath) throws Exception{
//删除
}
}
```
#### 4.将上传的Service加入Spring的容器中
```java
@Configuration
public class FileBeanConfig {
@Bean
public LocalOssService localOssService(){
return new LocalOssService();
}
}
```
### 拓展上传的类型
#### 继承UploadBaseService 指定上传的 FileTypeEnum
```java
public class ImgUploadService extends UploadBaseService {
@Override
protected FileTypeEnum fileType() {
return FileTypeEnum.IMG;
}
}
```
#### FileTypeEnum说明
> type:类型
>
> suffix:类型对应的后缀
>
>比如拓展XML格式的上传 XML("xml",[".xml"])
### 供应商配置说明
#### [七牛配置](help/QiNiu-Readme.md)
#### [UFile配置](help/UFile-Readme.md)
#### [阿里云配置](help/Aliyun-Readme.md)
#### [腾讯云配置](help/TencentCloud-Readme.md)
### 测试效果
#### 文件格式

修改ImgUploadService的fileType() 返回null
```java
public class ImgUploadService extends UploadBaseService {
@Override
protected FileTypeEnum fileType() {
return null;
}
}
```

#### 文件大小

修改UploadConfigVo的最大上传量
```java
@Override
public UploadConfigVo getUploadConfigVo() {
UploadConfigVo uploadConfigVo = new UploadConfigVo();
uploadConfigVo.setMaxSize(50 * 1024L); //最大上传
uploadConfigVo.setRenTag(YesNoConstant.YES);//开启重命名
return uploadConfigVo;
}
```

#### 重命名 开启则会在名称后面拼接UUID防止文件重名覆盖


> uploadConfigVo.setRenTag(YesNoConstant.NO);//关闭重命名
>
> 注:关闭重命名可能导致文件名称相同 导致文件覆盖

#### MD5

模拟MD5比对成功
```java
@Override
public String doCheckFileMd5(String nowFileMd5) {
log.info("比对文件MD5信息: {}",nowFileMd5);
return "E://模拟比对成功";
}
```

关闭MD5上传校验
```java
@Override
public boolean checkFileMd5() {
return false;
}
```

#### 删除


删除到最后一个文件时候,会删除空文件夹

### 未来计划
- 提供更多供应商的上传支持 ->阿里云/腾讯云....
- 各大供应商配置参数说明和如何获取该配置