1,设计资源表
-- ----------------------------
-- Table structure for tb_resource
-- ----------------------------
DROP TABLE IF EXISTS `tb_resource`;
CREATE TABLE `tb_resource` (
`id` bigint NOT NULL,
`file_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',
`oss_external_link` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'OSS外网链接',
`file_type` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型(后缀)',
`is_img` tinyint NULL DEFAULT NULL COMMENT '是否图片:0:否 1:是',
`size` bigint NULL DEFAULT NULL COMMENT '资源大小',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',
`create_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',
`sha1` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'sha1上传标识',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '资源表' ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
2,相关代码
2.1上传代码
public String uploadFile(MultipartFile file) throws IOException {
//1,判断当前图片是否已经上传过,如果上传过就直接返回对于resoure的id
String sha1 = getFileSha1(file);
LambdaQueryWrapper<Resource> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Resource::getSha1, sha1);
Resource resource = resourceMapper.selectOne(wrapper);
if (Objects.nonNull(resource)) {
log.info("本次上传\"{}\",已存在的重复文件~~~", file.getOriginalFilename());
return String.valueOf(resource.getId());
}
int index = file.getOriginalFilename().lastIndexOf(SymbolConstant.DOT);
String fileName = file.getOriginalFilename().substring(0, index);
String fileType = file.getOriginalFilename().substring(index + 1);
//2,上传到oss
String ossExternalLink = ossUpload(file, fileName, fileType);
//3,上传到服务器
String ossExternalLink = getFileUrl(file);
log.info("文件返回的链接:{}",ossExternalLink);
//4,组装数据入库
。。。。。
}
2.2,文件上传验证sha1唯一性
private String getFileSha1(MultipartFile file) {
InputStream inputStream;
MessageDigest digest = null;
byte[] buf = new byte[1024];
int len;
try {
inputStream = file.getInputStream();
digest = MessageDigest.getInstance("SHA1");
while ((len = inputStream.read(buf, 0, buf.length)) != -1) {
digest.update(buf, 0, len);
}
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
BigInteger bigInteger = new BigInteger(1, digest.digest());
return bigInteger.toString(16);
}
2.3,上传到oss
private String ossUpload(MultipartFile file, String fileName, String fileType) {
String uidStr = UIDGenerator.getUIDStr();
try {
OSS ossClient = new OSSClientBuilder().build(
ossProps.getEndpoint(),
ossProps.getAccessKeyId(),
ossProps.getAccessKeySecret());
PutObjectRequest putObjectRequest = new PutObjectRequest(ossProps.getBucketName(), uidStr + "." + fileType, file.getInputStream());
log.info("开始上传图片~~~, file = {}", fileName);
ossClient.putObject(putObjectRequest);
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
URL url = ossClient.generatePresignedUrl(ossProps.getBucketName(), uidStr + "." + fileType, expiration);
String path = url.getPath();
log.info("图片路径path = " + path);
String host = url.getHost();
log.info("图片host = " + host);
//图片路径
log.info("图片路径url = " + url.toString());
return url.toString();
} catch (Exception e) {
e.printStackTrace();
log.info("上传失败~~~~,errorMsg={}", e.getMessage());
return null;
} finally {
log.info("上传结束~~~~");
ossClient.shutdown();
}
}
2.4,上传到服务器
public String getFileUrl(MultipartFile file){
int index = file.getOriginalFilename().lastIndexOf(SymbolConstant.DOT);
//获取文件名称
String fileName = file.getOriginalFilename().substring(0, index);
//获取文件类型
String fileType = file.getOriginalFilename().substring(index + 1);
fileName = fileName+"."+fileType;
String host = ossProps.getEnvHost();
//保存目录
String directory = ossProps.getDir();
// 在内存中创建一个文件对象,注意:此时还没有在硬盘对应目录下创建实实在在的文件
File f = new File(directory, file.getOriginalFilename());
if (f.exists()) {
log.info("上传的文件名称为:{}",fileName);
} else {
// 先创建文件所在的目录
if (!f.getParentFile().exists()){
f.getParentFile().mkdirs();
}
try {
// 保存文件
file.transferTo(f);
} catch (IOException e) {
log.info("文件保存失败:{}",e);
}
}
log.info("文件的相对路径为:{}",f.getPath());
return host+"/"+fileName;
}