之前项目的图片是上传后保存在本地E盘的,在本地运行的时候简直完美,但等到用内网穿透访问或部署到服务器上后再访问,那1M的小水管要加载半天才能加载出来图片。原本无可奈何,结果突然发现买服务器时送了6个月的40G OSS存储包,这不是美滋滋吗,赶紧把之前的图片上传进去,然后把数据库里的路径全部加上OSS域名,再一试,速度飞起。结果我发现事情没这么简单,存储包是送的,但是流量要钱的[哭]。但是数据库里路径都改了,虽然有备份,但是用OSS来访问那个速度让我不想放弃。于是用了一会儿看了看价格。访问我的项目全部页面3次,虽然流量70多Mb,但是才一分钱。本穷逼可以接受。
那就把文件上传接口改了吧。由于我只需要将图片上传到OSS,并不需要做其他删除等操作,所以还是比较简单的。
首先导入依赖
<!--阿里上传文件到OSS存储依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
上传图片请求
@RestController
public class FileControllerToOSS {
@PostMapping({"/upLoadImg/{type}"})
public JSONObject upLoadImg(@RequestParam("file") MultipartFile file, @PathVariable("type") String type) throws Exception{
if (!CheckSession.checkSession()){
JSONObject jsonObject = new JSONObject();
jsonObject.put("code",1);
return jsonObject;
} else {
/*获取当前登录的用户id*/
Integer userId = GetUserId.getUserId();
String fileName = file.getOriginalFilename(); //获取原始路径
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); //获取文件&后缀名
String suffixName = fileName.substring(fileName.lastIndexOf(".")); //获取后缀名
String name = userId + Now.getNowTime("yyyyMMddHHmmss")+fileName;
String completePath = "userImages/"+ type+"/" + name;
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "";
String accessKeySecret = "";
InputStream inputStream = file.getInputStream();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建PutObjectRequest对象。
// PutObjectRequest putObjectRequest = new PutObjectRequest("", "", new File(""));
// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// 上传文件。
ossClient.putObject("", completePath, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
String src = ""+completePath;
JSONObject srcJson = new JSONObject();
srcJson.put("src",src);
JSONObject json = new JSONObject();
json.put("code",0);
json.put("msg","上传成功");
json.put("data",srcJson);
// System.out.println(json);
return json;
}
}
}
官方的文档已经比较详细,这里我将自己的那些key和url等删除了,按照官方的填入自己的即可