阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。非常适合存储非结构化数据,例如视频、图形、日志、文本文件以及各种App应用、多终端同步软件、网盘下载站的文件等,单个文件的大小从1字节到48.8TB,可以存储的个数无限制。
(1)登录阿里云:https://www.aliyun.com
(2)开通阿里云对象存储服务:对象存储OSS_云存储服务_企业数据管理_存储-阿里云
开通完之后在右上角 个人信息->AccessKey管理可以看到生成了一个AccessKey ID和AccessKey Secret。注意一定要保存好!!!这两个是访问阿里云 API 的密钥,具有对应账户完全的权限,且AccessKey Secret之后就查看不了了。
controller层
package com.ruoyi.web.controller.oss;
import com.ruoyi.oss.service.IOssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
public class FileController {
@Autowired
private IOssService ossService;
/**
* 上传文件
* @param file 文件
* @return
*/
@RequestMapping("/upload")
public Map uploadFile(MultipartFile file) {
//调用service层实现上传
String url = ossService.uploadFile(file);
Map map = new HashMap<>();
if (url==null){
map.put("code",5000);
map.put("msg","上传失败");
return map;
}
map.put("code",2000);
map.put("msg","上传成功");
map.put("url",url);
return map;
}
}
service
public interface IOssService {
public String uploadFile(MultipartFile file);
}
实现类
package com.ruoyi.oss.service.impl;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.ruoyi.oss.service.IOssService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/**
* @Auther: yang
* @Date:2023/07/11/14:46
*/
@Service
public class OssServiceImpl implements IOssService {
@Value("${aliyun.oss.file.end-point}")
String endpoint;
@Value("${aliyun.oss.file.access-key-id}")
String accessKeyId;
@Value("${aliyun.oss.file.access-key-secret}")
String accessKeySecret;
@Value("${aliyun.oss.file.bucket-name}")
String bucketName;
@Override
public String uploadFile(MultipartFile file) {
long l = System.currentTimeMillis();
//获取文件名
String fileName = l+"."+file.getOriginalFilename();
//创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
try {
//获得文件流
InputStream inputStream = file.getInputStream();
//创建putObject请求
ossClient.putObject(bucketName,fileName,inputStream);
//返回拼接后oss访问路径
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
return url;
}catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
return null;
}catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
return null;
}catch (IOException e) {
e.printStackTrace();
return null;
}finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
我这里命名上传后的文件名为当前时间戳.文件名(可以改成自己想要的格式)
AccessKey Id和AccessKey secret是我们生成的阿里云api密钥
bucketName就是对应bucket的名字
endpoint:进入bucket列表->点击对应的bucket->概览->复制访问端口中的外网访问的Endpoint
application.yml(在配置文件中配置OSS)
#配置阿里云oss
aliyun:
oss:
file:
end-point: 你的endpoint
access-key-id: 你的accesskey Id
access-key-secret: 你的accessKey secret
bucket-name: 你的bucketName
到这里我们就可以调用接口正常的上传文件了,不过我这个对象存储有个问题,可以接受任意类型的文件上传,但是在前端页面只能显示图片类型的,例如txt文件就无法查看,看了别人的博客有的说是需要加上自己的域名才能正常显示,不过我还没有尝试,大家可以试一试,如果可以的话可以留言告诉我一下。
另外我刚接触对象存储,很多地方存在不足,这个只能算是解决一时之需,如果想深入了解对象存储,可以互相交流一下,乐意接受批评!
谢谢浏览!