在写课设的过程中需要使用到图片上传存储的功能,所以我想到了使用阿里云的OSS对象存储来进行管理用户上传的图片,以下是我经过查阅资料总结出的集成方式。
详情可以查阅阿里云开发指南:https://help.aliyun.com/product/31815.html
-
导入依赖
<!-- 阿里云oss存储api--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.5.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency>
-
编写工具类
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.ObjectMetadata; import java.io.InputStream; import java.net.URL; import java.util.Date; /** * project : blog-ssm * <p> *OSS工具类 * </p> * * @autor:lzj * @date:2022/6/5 */ public class OssManager { private static final String accessKeyId = "LTAI5tHH34HUzs********"; //需要修改的 个人开发id private static final String accessKeySecret = "I75k7Q2h0F***********"; //需要修改的 开发密匙 /** * 需要修改 * 根据选择的存储空间地点选择:https://help.aliyun.com/document_detail/31837.html?spm=a2c4g.11186623.2.10.5d396a3eVRGHxs#h2-url-1 */ private static final String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; /** * 需要修改的存储空间的名称 */ public static final String bucket = "lzj-love-study"; /** * bucket域名 */ public static final String bucketDomain="https://lzj-love-study.oss-cn-hangzhou.aliyuncs.com"; private static OSS client; static { client = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } /** * 上传图片 * @param fileName 图片名称,图片名称包括文件夹名称和“/” * @param length 图片大小 * @param content 输入流 */ public static void uploadImage(String fileName, long length, InputStream content) { uploadBucketImage(bucket, fileName, length, content); } /** * 上传文件 * @param bucket 存储空间名 * @param fileName 文件名(包括文件夹名称和“/”) * @param length 流的长度 * @param content 输入流 */ public static void uploadBucketImage(String bucket, String fileName, long length, InputStream content) { // 创建上传Object的Metadata ObjectMetadata meta = new ObjectMetadata(); // 必须设置ContentLength meta.setContentLength(length); // 上传Object. client.putObject(bucket, fileName, content, meta); } /** * 删除文件 * @param fileName 文件名称,图片名称包括文件夹名称和“/” */ public static boolean delShopImage(String fileName) { //判断文件是否存在 boolean exist = client.doesObjectExist(bucket, fileName); //文件不存在删除失败 if ( ! exist){ return false; } //执行删除 client.deleteObject(bucket, fileName); return true; } /** * 获得上传文件后url链接 * @param fileName 文件名(包括文件夹名称和“/”) * @return */ public static String getUrl(String fileName) { // 设置URL过期时间为10年 3600l* 1000*24*365*10 Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10); // 生成URL URL url = client.generatePresignedUrl(bucket, fileName, expiration); if (url != null) { return url.toString(); } return null; } /** * 创建存储空间 * @param bucketName 新建存储空间默认为标准存储类型,私有权限。 * @return */ public static void crateBucket(String bucketName) { // 新建存储空间默认为标准存储类型,私有权限。 client.createBucket(bucketName); } }
-
controller层中使用
Conts常量工具类:
public static final String PROJECTURL="project/blog-ssm/"; public static final String AVATORIMAGEURL=PROJECTURL+"images/";
将获取到的文字符流写入到对应地址
@RestController @RequestMapping("/admin/upload") public class UploadFileController extends BaseController{ /** * 上传文件 * @param multipartFile * @return */ @RequestMapping(value = "/img", method = RequestMethod.POST) public JsonResult<String> uploadFile(@RequestParam("file") MultipartFile multipartFile) { InputStream inputStream=null; try { inputStream = multipartFile.getInputStream(); } catch (IOException e) { e.printStackTrace(); } //拼接文件夹名字会指定上传到存储空间下面的子文件夹(文件名改为:当前时间到毫秒+uuid+原来文件后缀名) //Conts.AVATORIMAGEURL为定义的常量 String originalFilename= Conts.AVATORIMAGEURL +System.currentTimeMillis() + UUID.randomUUID().toString() + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".")); //使用封装的工具类进行上传 OssManager.uploadImage(originalFilename, multipartFile.getSize(),inputStream); String data=OssManager.bucketDomain+"/"+originalFilename; System.out.println("========================="); System.out.println(data); return new JsonResult<>(OK,data); } }