阳光沙滩博客系统上传图片方式改为OSS对象存储
一、前言
本来想改为FastDFS+Nginx进行图片上传和预览的,但大锯哥说了FastDFS技术是公司里那些不思进取的老油条才用的,所以为了不做不思进取的老油条,还是改为对象存储吧,哈哈哈哈,不过用完以后真的比FastDFS+Nginx简单多了。这个本来想等前端后端都写完再进行改的,但是我写到前端二十多集的时候因为没有那个js文件卡住了,币又差点,只好提前学习对象存储改代码了,再写文章凑币买资料了[捂脸]
二、准备
- 申请自己的阿里云账号,并开通OSS对象存储服务。
- 在对象存储界面创建存储空间,记住Bucket名称和创建成功后得到的地域节点Endpoint名 等会代码中需要用到。
- 还需要提供AccessKeyId和AccessKeySecret值,点击查看获取AccessKeyId和AccessKeySecret方法 想了解OSS对象存储的可以点击下方链接 点击进入OSS帮助文档
三、开始
1. 导入依赖
<!--对象存储-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
2. 添加工具类
- 需要设置的固定值
- 具体介绍都在代码中
/**
* 使用OOS上传图片
*/
public class UploadImageUtils {
/**
* 上传图片 并获取url地址
* @param file 上传的图片
* @param targetPath 拼接好的上传地址和图片名
* 只能以字母或数字开头,不可以使用“/”或“\”开头
* @return url地址
*/
public static String uploadImage(MultipartFile file, String targetPath){
try {
// 1 获取上传需要的固定值
String endpoint = Constants.OOS.END_POINT; //你的站点
String bucketName = Constants.OOS.BUCKET_NAME; //你的bucket_name 存储空间名称
String accessKeyId = Constants.OOS.ACCESS_KEY_ID; //你的acess_key_id
String accessKeySecret = Constants.OOS.ACCESS_KEY_SECRET; //你的acess_key_secret
//2 创建OssClient对象
OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
//3 获取文件信息,为了上传
//文件输入流
InputStream in = file.getInputStream();
//文件名称
// meta设置请求头
ObjectMetadata meta = new ObjectMetadata();
//必须设置jpg,不然打开地址就是直接下载 不可以预览
meta.setContentType("image/jpg");
ossClient.putObject(bucketName, targetPath, in, meta);
//关闭ossClient
ossClient.shutdown();
//返回上传之后地址,拼接地址
String uploadUrl = "https://"+bucketName+"."+endpoint+"/"+targetPath;
return uploadUrl;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
3. 修改业务层上传图片的代码
/**
* 上传图片
* @param file
* @return
*/
@Override
public ResponseResult uploadImage(MultipartFile file) {
//判断是否有文件
if (file == null) {
return ResponseResult.FAILED("图片不可为空");
}
//判断文件类型,只支持图片上传,png jpg gif
String contentType = file.getContentType();
log.info("contentType == >" + contentType);
if (TextUtils.isEmpty(contentType)) {
return ResponseResult.FAILED("图片格式错误");
}
//获取相关数据 比如 文件类型 文件名称
String originalFilename = file.getOriginalFilename();
log.info("originalFilename ======>>" + originalFilename);
//判断是否支持该类型
String type = getType(contentType, originalFilename);
if (type == null) {
return ResponseResult.FAILED("不支持此文件类型");
}
//限制文件的大小
long size = file.getSize();
log.info("maxsize === > " + maxSize + " size === > " + size);
if (size > maxSize) {
return ResponseResult.FAILED("图片最大仅支持" + (maxSize / 1024 / 1024) + "Mb");
}
//创建图片的保存目录
//规则:配置目录/日期/类型/ID.类型
long currentMillions = System.currentTimeMillis();
String currentDay = simpleDateFormat.format(currentMillions);
log.info("current day === > " + currentDay);
//将图片重新命名
String targetName = String.valueOf(idWorker.nextId());
//图片将要保存的路径
//https://bucketName.oss-cn-beijing.aliyuncs.com/sob_blog_image/2020_08_15/jpg/744262881280786432.jpg
String targetPath = "sob_blog_image/" + currentDay + "/" + type + "/" + targetName + "." + type;
//保存文件
try {
//获取上传后的路径
String url = UploadImageUtils.uploadImage(file, targetPath);
log.info("OOS path === > " + url);
//保存记录到数据库
//返回结果,包含这个图片的名称和访问路径
//1.访问路径
Map<String, String> result = new HashMap<>();
String resultPath = currentMillions + "_" + targetName + "." + type;
result.put("id", resultPath);
//2.名称---》alt="图片描述"
result.put("name", originalFilename);
Image image = new Image();
image.setContentType(contentType);
image.setId(targetName);
Date date = new Date();
image.setCreateTime(date);
image.setUpdateTime(date);
image.setPath(targetPath);
image.setName(originalFilename);
image.setUrl(url);
image.setState("1");
SobUser sobUser = userService.checkSobUser();
image.setUserId(sobUser.getId());
//记录文件
imageDao.save(image);
//返回结果
return ResponseResult.SUCCESS("文件上传成功").setData(result);
} catch (Exception e) {
e.printStackTrace();
}
return ResponseResult.FAILED("图片上传失败");
}
/**
* 判断文件的类型,只支持图片
* @param contentType
* @param name
* @return
*/
private String getType(String contentType, String name) {
String type = null;
if (Constants.ImageType.TYPE_PNG_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_PNG)) {
type = Constants.ImageType.TYPE_PNG;
} else if (Constants.ImageType.TYPE_JPG_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_JPG)) {
type = Constants.ImageType.TYPE_JPG;
} else if (Constants.ImageType.TYPE_GIF_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_GIF)) {
type = Constants.ImageType.TYPE_GIF;
}
return type;
}
四、测试
都修改好以后可以进行测试了,下面是已经上传好的。
看到这里了,不妨留个赞再走吧,嘿嘿嘿。
本文由
loneliness
原创发布于
阳光沙滩
,未经作者授权,禁止转载