【01】什么是阿里云 ?
这是阿里云的官网:https://www.aliyun.com
(1.1)打开官网之后,就是这个样子的。
【2】什么是阿里云OSS ?
(2.2)下面红框是阿里云OSS的一个简介,简而言之,他就是一个文件存储的服务。
比如你的网站开发,假设需要用到图片上传,文件上传等功能。
以前我们的做法是,自己搭建一个图片服务器或者文件服务器,然后自己在写一套相关的实现方法。
但现在我们如果用了阿里云的OSS的话,这一块儿就可以省去我们买服务器的钱和写代码实现的时间。
【3】注册与登录
既然要使用人家的功能,总不能白白使用,肯定是需要一个账号付费的,左边登录,右边注册,自己看着办。
有账号的点登录,没账号的先注册一个,然后登录。已经登录的就当我没说。
【4】开通OSS
(4.1)登录成功后,如果没有开通OSS的,则点击【立即开通】,然后他会提示相关方案。
开通的过程中他会让你选择个人版还是企业版,后面的API接口都一样,自己根据业务需要开通过即可。
(4.2)如果已经开通,则可以看到【管理控制台】
【5】创建 Bucket
Bucket 的中文意思是桶,桶是用来干嘛的?当然是装东西的。也就是官方说的存储空间。
你可以理解为你电脑中的C盘、D盘、E盘等。
(5.2)创建Bucket的时候,会让你填写相关信息,一般来说我们只填名称和选择区域,其他都默认就好。
Bucket名称是唯一的,这个唯一同其他所有用户,比如sunny这个桶已经有人用了,那么你就不能用这个了。至于是谁用的,你不知道,我也不知道。
区域就是你想把你东西存放到哪个地方,从功能来说,选哪个都一样。
选择完毕后,点击【确定】完成创建。
【6】记住桶名(bucketName)和 外网地域节点(endPoint)
(6.1)完成创建后,就可以看到这个存储空间 sunnyzyq 了,右边是空间的相关介绍。记住这个桶名 (bucketName),等会撸代码的时候需要。
(6.2)另外,还有记住你的这个Endpoint,等会撸代码的时候也需要。
【7】创建AccessKey,获取授权信息
阿里云的OSS只是一个服务,我们要使用服务,需要 AccessId 和 AccessKey 进行授权。不光是阿里接口,几乎所有API接口都有这一步。
如果找不到创建AccessKey的入口可以搜索一下
点击【创建AccessKey】。
然后他会向你发验证码,确认是否是本人操作,输入验证码后,就会得到相关的的 AccessKeyId 和 AccessKeySecret 了。
【8】确保余额充足
现在万事俱备,只差充值。阿里不可能让你白玩的,多冲少冲,多少要冲,我们往账户冲点钱,多少由你自己决定。
【9】阿里云OSS实战
空间现在有了,金额有了,授权有了,我们就可以实际操作一把了。
OSS具体开发文档链接地址为:https://help.aliyun.com/product/31815.html
例如:我们往上面上传一张图片。以下为复制别的地方的内容
打开项目,在pom.xm中引入oss关联的依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
创建包 com.aliyu.oss,包下创建类 AliyunOssUntil.java
我们去百度找一张漂亮小姐姐的图片,保存到桌面。
然后把她拷贝到项目中,放在最外层根目录里。
然后我们就开始进入最关键的撸代码部分了。
我们给上传的图片重新取个名字,叫为: zhaoliying.jpg 。
package com.aliyun.oss;
import java.io.File;
public class AliyunOssUntil {
public static final String endpoint = "你的endpoint";
public static final String accessKeyId = "你的accessKeyId";
public static final String accessKeySecret = "你的accessKeySecret";
public static final String bucketName = "你的桶名";
public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
public static void main(String[] args) {
ossClient.putObject(bucketName, "zhaoliying.jpg", new File("zly.png"));
ossClient.shutdown();
System.out.println("上传图片完成!");
}
}
OK,代码撸好了,我们执行下。控制台显示了,说明程序已经执行完毕。再去看下控制面板里是否已经成功上传
总结:OK,阿里云的 OSS 如何使用已经介绍完成了,虽然只举了一个例子,但整个流程已经打通完毕。
上传后遇到的问题:
You have no right to access this object because of bucket acl.
这是使用阿里云OSS上传文件服务时报的错,这是由于新建的子用户AccessKey没有配置相应的权限所导致的。
解决方法,配置上相应权限。
找到相关子用户,添加权限:
添加上权限后即可正常上传文件了。
集成到springboot项目中
4.1 阿里云OSS配置
在resource下新建一个application-oss.properties
aliyun.endpoint=oss-cn-shanghai.aliyuncs.com
aliyun.accessKeyId=你的accessKeyId
aliyun.accessKeySecret=你的accessKeySecret
aliyun.bucketName=gaojun-testbucket
aliyun.urlPrefix=http://gaojun-testbucket.oss-cn-shanghai.aliyuncs.com/
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB
在java的包下新建一个config包,创建一个AliyunConfig.java
package com.evaluation.tcvl.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String urlPrefix;
@Bean
public OSS oSSClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
4.2 后端业务
4.2.1 vo
该实体类用于后台返回给前台
package com.evaluation.tcvl.pojo.vo;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
@Data
public class FileUploadResult {
// 文件唯一标识
private String uid;
// 文件名
private String name;
// 状态有:uploading done error removed
private String status;
// 服务端响应内容,如:'{"status": "success"}'
private String response;
//返回的有用数据
private Map<String,Object> data = new HashMap<>();
}
4.2.2 service
在service使用ossClient操作阿里云OSS,进行上传、下载、删除、查看所有文件等操作,同时可以将图片的url进行入库操作。
package com.evaluation.tcvl.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.evaluation.common.result.Re;
import com.evaluation.tcvl.config.AliyunConfig;
import com.evaluation.tcvl.pojo.vo.FileUploadResult;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class FileUploadService {
// 允许上传的格式
// private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};
@Autowired
private OSS ossClient;
@Autowired
private AliyunConfig aliyunConfig;
/**
* 文件上传
* @param uploadFile
* @return
*/
public Re upload(MultipartFile uploadFile) {
// 校验图片格式
// boolean isLegal = false;
// for (String type : IMAGE_TYPE) {
// if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),
// type)) {
// isLegal = true;
// break;
// }
// }
//封装Result对象,并且将文件的byte数组放置到result对象中
// FileUploadResult fileUploadResult = new FileUploadResult();
// if (!isLegal) {
// fileUploadResult.setStatus("error");
// return fileUploadResult;
// }
//文件新路径
String fileName = uploadFile.getOriginalFilename();
String filePath = getFilePath(fileName);
// 上传到阿里云
try {
ossClient.putObject(aliyunConfig.getBucketName(), filePath, new
ByteArrayInputStream(uploadFile.getBytes()));
} catch (Exception e) {
e.printStackTrace();
//上传失败
// fileUploadResult.setStatus("error");
// return fileUploadResult;
Re.error().message("上传失败");
}
// fileUploadResult.setStatus("done");
// fileUploadResult.setResponse("success");
//this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保存到数据库
Map<String,Object> map = new HashMap<>();
map.put("url",this.aliyunConfig.getUrlPrefix() + filePath);
map.put("name",fileName);
// map.put("uid",String.valueOf(System.currentTimeMillis()));
// fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
// fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
// fileUploadResult.setData(map);
// return fileUploadResult;
return Re.ok().data("data",map).message("上传成功");
}
/**
* 生成路径以及文件名
* @param sourceFileName
* @return
*/
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "Store/" + dateTime.toString("yyyy")
+ "/" + dateTime.toString("MM") + "/"
+ dateTime.toString("dd") + "/" +
sourceFileName;
// + "." +
// StringUtils.substringAfterLast(sourceFileName, ".")
}
/**
* 查看文件列表
* @return
*/
public List<OSSObjectSummary> list() {
// 设置最大个数。
final int maxKeys = 200;
// 列举文件。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
return sums;
}
/**
* 删除文件
* @param objectName
* @return
*/
public Re delete(String objectName) {
// 根据BucketName,objectName删除文件
ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);
// FileUploadResult fileUploadResult = new FileUploadResult();
// fileUploadResult.setName(objectName);
// fileUploadResult.setStatus("removed");
// fileUploadResult.setResponse("success");
// return fileUploadResult;
return Re.ok().data("data",objectName).message("删除成功");
}
/**
* 下载文件
* @param os
* @param objectName
* @throws IOException
*/
public void exportOssFile(OutputStream os, String objectName) throws IOException {
// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);
// 读取文件内容。
BufferedInputStream in = new BufferedInputStream(ossObject.getObjectContent());
BufferedOutputStream out = new BufferedOutputStream(os);
byte[] buffer = new byte[1024];
int lenght = 0;
while ((lenght = in.read(buffer)) != -1) {
out.write(buffer, 0, lenght);
}
if (out != null) {
out.flush();
out.close();
}
if (in != null) {
in.close();
}
}
}
4.2.3 controller
controller进行接收用户请求
package com.evaluation.tcvl.controller;
import com.aliyun.oss.model.OSSObjectSummary;
import com.evaluation.common.result.Re;
import com.evaluation.tcvl.pojo.vo.FileUploadResult;
import com.evaluation.tcvl.service.impl.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("/file")
@Api(tags = "阿里oss接口")
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
@PostMapping("/upload")
@ApiOperation(value = "文件上传到oss")
@ResponseBody
public Re upload(@RequestParam("file") MultipartFile uploadFile)
throws Exception {
return this.fileUploadService.upload(uploadFile);
}
@PostMapping("/delete")
@ApiOperation(value = "根据文件名删除oss上的文件")
@ResponseBody
public Re delete(@RequestParam("fileName") String objectName)
throws Exception {
return this.fileUploadService.delete(objectName);
}
@GetMapping("/list")
@ApiOperation(value = "查询oss上的所有文件")
@ResponseBody
public List<OSSObjectSummary> list()
throws Exception {
return this.fileUploadService.list();
}
@GetMapping("/download")
@ApiOperation(value = "根据文件名下载oss上的文件")
@ResponseBody
public void download(@RequestParam("fileName") String objectName, HttpServletResponse response) throws IOException {
//通知浏览器以附件形式下载
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(objectName.getBytes(), "ISO-8859-1"));
this.fileUploadService.exportOssFile(response.getOutputStream(),objectName);
}
}