上传到云存储
概述
通过UploadManager上传
服务层实现类中我们接收到传入的图片对象,获取文件名称,后判断图片名称后缀(png/)是否符合要求,然后获取当前日期时间,以日期路径+uuid随机生成的不重复文件名 + 后缀 的形式拼接成文件名,然后new一个带指定Region的Configuration配置类对象,通过该配置类对象指定图片上传的API版本(V1或V2),以此new一个UploadManager对象,将云存储器的accessKey、secretKey、bucket通过封装成Auth对象,通过UploadManager对象put 图片文件stream流、新图片文件名、Auth对象以实现文件上传到云存储器。
大概步骤
上传到云存储器:
1.获取图片文件名,判断图片类型
2.通过当前时间+UUID+原后缀 生成新文件名字符串
3.指定图片分片上传API版本,构建一个UploadManager对象
4.转换原图片为stream流
5.封装accessKey、secretKey、bucket为Auth对象
6.通过UploadManager对象put图片流、新图片名、Auth对象实现上传并返回外链
7.最后将路径存入数据库
详细步骤
1.获取图片文件名,判断图片类型
@Service
public class OssUploadServiceImpl implements UploadService {
@Override
public ResponseResult uploadImg(MultipartFile img) {
//1.获取文件名
String originalFilename = img.getOriginalFilename();
//判断类型
if(!originalFilename.endsWith(".png")){
throw new SystemException(AppHttpCodeEnum.FILE_TYPE_ERROR);
}
2.通过当前时间+UUID+原后缀 生成新文件名字符串
public static String generateFilePath(String fileName){
//根据日期生成路径 2022/1/15/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
String datePath = sdf.format(new Date());
//随机生成uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
//以日期路径+uuid+后最的形式拼接成文件名返回
return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
}
3.指定图片分片上传API版本,构建一个UploadManager对象
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
4.转换原图片为stream流
InputStream inputStream = imgFile.getInputStream();
5.封装accessKey、secretKey、bucket为Auth对象
private String accessKey; //启动时从yml配置文件中获得
private String secretKey; //云服务密钥
private String bucket;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
6.通过UploadManager对象put图片流、新图片名、Auth对象返回外链
上传到服务器本地
Response response = uploadManager.put(inputStream, key, upToken, null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
上传到服务器本地存储
概述
服务层实现类中我们接收到传入的图片对象,获取文件名称,后判断图片名称后缀(png/)是否符合要求,然后获取当前日期时间,以日期路径+uuid随机生成的不重复文件名 + 后缀 的形式拼接成文件名, 通过multipartFile.transferTo(“存储目录文件名”)存储到服务器本地并返回存储路径。
大概步骤
上传到云存储器:
1.获取图片文件名,判断图片类型
2.通过当前时间+UUID+原后缀 生成新文件名字符串
3.通过MultipartFile图片自带的transferTo(“新存储目录+文件名”)方法实现存储并返回存储路径
4.最后将路径存入数据库
详细步骤
@Override
public Object uploadImages(MultipartFile multipartFile) {
System.out.println("图片:==="+multipartFile);
// 1、获取真实文件名
String originalFilename = multipartFile.getOriginalFilename();
// 判断后缀,截取图片的后缀 lastIndexOf最后出现.的位置
String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 2、生成唯一文件名
String newFileName = UUID.randomUUID().toString()+imgSuffix;
System.out.println("新文件名==="+newFileName);
// 日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy\\MM\\dd");
String dataPath = dateFormat.format(new Date());
//
File targetPath = new File(uploadPath, dataPath); // 拼接成新目录
System.out.println("上传目录==="+targetPath);
// mkdirs:不存在则创建,mkdir:不存在则返回false
if(!targetPath.exists()) targetPath.mkdirs(); // 如果目录不存在,则递归创建
//指定文件上传后的服务器完整路径[包括文件名]
File TargetFileName = new File(targetPath, newFileName);
System.out.println("完整路径:==="+TargetFileName);
// 3、文件上传到指定目录
try {
multipartFile.transferTo(TargetFileName); // 文件上传到指定目录
System.out.println("文件上传到目录==="+TargetFileName); // D:\2021\12\05\68f61bc7-07b9-41c6-876b-22c9a57f5606.png
String finalFileName = dataPath + "\\" + newFileName;
System.out.println("返回路径==="+visitPath+"\\"+finalFileName);
//4.将存储路径存入数据库
Long userId = SecurityUtils.getUserId();
User user = userService.getById(userId);
user.setAvatar(finalFileName);
userService.updateById(user);
return visitPath+"\\"+finalFileName; // 返回可访问的地址
} catch (IOException e) {
e.printStackTrace();
return "fail";
}
}