下面给大家安排一套SpringBoot实现文件上传的demo,从数据库到测试,非常的完善详细。
1.创建表脚本
CREATE TABLE `file` (
`id` bigint(225) NOT NULL AUTO_INCREMENT COMMENT '文件ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名',
`suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型',
`path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件相对路径',
PRIMARY KEY (`id`) USING BTREE
) NGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT = '文件表';
2.yaml文件增加文件存储路径
file:
#上传路径
path: d:/file/
access:
base-url:
#访问路径
file: d:/file/
3.实体类
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class File implements Serializable {
private static final long serialVersionUID = 1L;
/** 文件ID */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 文件名 */
private String name;
/** 文件类型 */
private String suffix;
/** 文件相对路径 */
private String path;
/** 文件原名字 */
@TableField(exist = false)
private String oldName;
}
4.文件返回视图类
@Data
@ApiModel("文件")
public class FileVO {
@ApiModelProperty(value = "文件ID")
private Long id;
@ApiModelProperty(value = "源文件名")
private String oldName;
@ApiModelProperty(value = "现文件名")
private String name;
@ApiModelProperty(value = "文件类型")
private String suffix;
@ApiModelProperty(value = "访问地址")
private String url;
}
5.Controller类
@Slf4j
@RestController
@Api(tags = "文件上传接口")
@RequestMapping("/file")
public class FileController {
@Resource
private FileService fileService;
@ApiOperation("文件单个上传")
@PostMapping("/upload")
public ResultObj uploadByOne(@RequestParam("file") MultipartFile file) {
try (InputStream is = file.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream()) {
IOUtils.copy(is, os);
byte[] bytes = os.toByteArray();
FileVO vo = fileService.storeFile(bytes, file.getOriginalFilename());
return new ResultObj(vo);
} catch (IOException e) {
log.error("文件上传发生异常 -> {}", e.getMessage());
return new ResultObj(ResultObj.BAD_REQUEST, errorMessageVo, "上传异常发生", "信息得错误信息");
}
}
}
6.Service接口
public interface FileService extends IService<File> {
/**
* 文件上传
* @param content
* @param originFileName
* @return
*/
FileVO storeFile(byte[] content, String originFileName);
}
7.Service接口实现类
@Service
public class FileServiceImpl extends ServiceImpl<FileMapper, File> implements FileService {
@Value("${file.path}")
private String FILE_PATH;
@Value("${access.base-url.file}")
private String ACCESS_BASE_URL;
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
@Override
public FileVO storeFile(byte[] content, String originFileName) {
// 获取文件后缀 生成目录路径
// 配置文件里的file.path + yyyyMMdd 格式组成文件夹路径
String folder = LocalDateTime.now().format(dateTimeFormatter);
String suffix = originFileName.substring(originFileName.lastIndexOf(".")),
filePath = FILE_PATH + folder + java.io.File.separatorChar;
// 保存文件并返回文件名
String fileName = this.storeFile(content, filePath, suffix);
// 入库
File file = new File();
file.setName(fileName);
file.setSuffix(suffix);
file.setPath(folder);
file.setOldName(originFileName);
baseMapper.insert(file);
FileVO result = BeanUtil.toBean(file, FileVO.class);
result.setUrl(genAccessUrl(folder, fileName));
result.setId(file.getId());
return result;
}
private String storeFile(byte[] content, String path, String suffix) {
String fileName = generateFileName(suffix);
storeFileWithFileName(content, path, fileName);
return fileName;
}
private String generateFileName(String suffix) {
return generateFileName() + suffix;
}
private String genAccessUrl(String folder, String name) {
return ACCESS_BASE_URL + folder + "/" + name;
}
private String generateFileName() {
return System.currentTimeMillis() + "_" + RandomUtil.randomNumbers(6);
}
}