1.开通服务
登录阿里云的官方申请oss服务阿里云官网
搜索oss对象存储 然后申请,这里我已经申请过了
2.然后打开控制台
按顺序创建一个Bucket仓库
有的时候仓库可能没有添加到访问路径我们可以自己手动添加根据提示选择
进入仓库看看详细信息
这里我们需要记录一下外网访问节点,后面访问的时候需要用到
然后我们鼠标放在又上角头像图标上,在弹出框选择AccessKey管理或者直接搜索
申请一个 key-value秘钥 可以理解为远程访问的 账户密码。
3.实践
我主要讲解一些常用 的方法更多的内容需要参考官方文档
3.1 创建Maven项目,引入依赖
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swagger ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- aliyun-oos -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!-- apache-common-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
3.2 创建oss工具类 实现 查询创建仓库功能 和基本配置信息
package com.dfp.common.aliyun;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import lombok.Data;
@Data
public class OssUtil {
private static String ENDPOINT="你的节点";//外网访问节点
private static String AccessKeyID="你的id"; //accID
private static String AccessKeySecret="你的密码";//ACCSecret
private static String BUKETNAME="demotest-dfp2";//仓库名称
private static String SUFFER_URL ="http://"+BUKETNAME+"."+ENDPOINT; //上传成功返回的url,仓库名称+节点地址
/**
* 获取oss链接
*/
public OSSClient getOSSClient(){
OSSClient ossClient=new OSSClient(ENDPOINT,AccessKeyID,AccessKeySecret);
//判断是否存在仓库
if (ossClient.doesBucketExist(BUKETNAME)){
System.out.println("存在仓库");
ossClient.shutdown();
}else{
System.out.println("不存在仓库....创建一个仓库"+BUKETNAME);
CreateBucketRequest bucketRequest=new CreateBucketRequest(null);
bucketRequest.setBucketName(BUKETNAME);//设置仓库名称
bucketRequest.setCannedACL(CannedAccessControlList.PublicRead);//设置仓库权限 公共读
ossClient.createBucket(bucketRequest);
ossClient.shutdown();
}
return ossClient;
}
public static void main(String[] args) {
OssUtil util=new OssUtil();
util.getOSSClient();
}
}
我们运行一下main方法
到阿里云的控制台刷新
多了一个仓库地址这样我们就远程创建了一个地址。
4 上传文件(与3.2关系不大)
4.1构建一个较为完整的项目
4.2配置类
package com.dfp.aliyunossdemo.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class AliyunOSSConfig {
private String endPoint="xxxxxxxx";// 地域节点
private String accessKeyId="xxxxxxxxx";
private String accessKeySecret="xxxxxxxxxxxxxx";
private String bucketName="demotest-dfp";// OSS的Bucket名称
private String urlPrefix="demotest-dfp.oss-cn-shenzhen.aliyuncs.com";// Bucket 域名
private String fileHost="fileTest";// 目标文件夹
@Bean
public OSS OSSClient(){
return new OSSClient(endPoint,accessKeyId,accessKeySecret);
}
}
package com.dfp.aliyunossdemo.config;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class Swagger2Config {
@Bean
public Docket createRestApi() {
// 为swagger添加header参数可供输
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.basePackage("com.dfp"))
.paths(PathSelectors.any()).build();
// .globalOperationParameters();
}
/**
* @Description: 构建 api文档的信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// 设置页面标题
.title("使用swagger2构建短视频后端api接口文档")
// 设置联系人
.contact(new Contact("dfp", "http://www.dfp.com", "1156655386@qq.com"))
// 描述
.description("欢迎访问短视频接口文档,这里是描述信息")
// 定义版本号
.version("1.0").build();
}
}
4.3Service层
package com.dfp.aliyunossdemo.service;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.dfp.aliyunossdemo.config.AliyunOSSConfig;
import com.dfp.aliyunossdemo.enums.Result;
import com.dfp.aliyunossdemo.enums.ResultCodeEnum;
import com.dfp.aliyunossdemo.enums.StatusCode;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
public class FileUploadService {
//设置允许上传文件格式
private static final String[] IMAGE_TYPE=new String[]{".bmp",".jpg",".jpeg",".png",".gif",".mp3",".mp4",".mkv"};
@Autowired
private OSS ossClient;
@Autowired
private AliyunOSSConfig aliyunOSSConfig;
public String upload(MultipartFile file){
String bucketNanme=aliyunOSSConfig.getBucketName();
String endPoint = aliyunOSSConfig.getEndPoint();
String accessKeyId = aliyunOSSConfig.getAccessKeyId();
String accessKeySecret = aliyunOSSConfig.getAccessKeySecret();
String fileHost = aliyunOSSConfig.getFileHost();
//返回的Url
String returnUrl="";
//审核上传文件是否符合规定格式
boolean isLegal=false;
for (String type:IMAGE_TYPE){
if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(),type)){
isLegal=true;
break;
}
}
if (!isLegal){
// 如果不正确返回错误状态码
return StatusCode.ERROR.getMsg();
}
//获取文件的名称
String originalFilename = file.getOriginalFilename();
//截取文件类型
String fileType = originalFilename.substring(originalFilename.lastIndexOf("."));
// 最终保存文件名称
String newFileName= UUID.randomUUID().toString()+ fileType;
//构建日期路径 ps :oss目标文件夹/yyyy/MM/dd文件名称
String filePath=new SimpleDateFormat("yyyy/MM/dd").format(new Date());
// 文件上传文件的路径
String uploadUrl=fileHost+"/"+filePath+"/"+newFileName;
// 获取文件输入流
InputStream inputStream=null;
try{
inputStream=file.getInputStream();
}catch (IOException e){
e.printStackTrace();
}
//文件上传到阿里云oss
// ossClient.put
ossClient.putObject(bucketNanme,uploadUrl,inputStream);//,meta
returnUrl="http://"+bucketNanme+"."+endPoint+"/"+uploadUrl;
return returnUrl;
}
}
4.4 异常处理统一返回结果
package com.dfp.aliyunossdemo.enums;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 全局统一返回结果类
*/
@Data
@ApiModel(value = "全局统一返回结果")
public class Result<T> {
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private T data;
public Result(){}
protected static <T> Result<T> build(T data) {
Result<T> result = new Result<T>();
if (data != null)
result.setData(data);
return result;
}
public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
Result<T> result = build(body);
result.setCode(resultCodeEnum.getCode());
result.setMessage(resultCodeEnum.getMessage());
return result;
}
public static <T> Result<T> build(Integer code, String message) {
Result<T> result = build(null);
result.setCode(code);
result.setMessage(message);
return result;
}
public static<T> Result<T> ok(){
return Result.ok(null);
}
/**
* 操作成功
* @param data
* @param <T>
* @return
*/
public static<T> Result<T> ok(T data){
Result<T> result = build(data);
return build(data, ResultCodeEnum.SUCCESS);
}
public static<T> Result<T> fail(){
return Result.fail(null);
}
/**
* 操作失败
* @param data
* @param <T>
* @return
*/
public static<T> Result<T> fail(T data){
Result<T> result = build(data);
return build(data, ResultCodeEnum.FAIL);
}
public Result<T> message(String msg){
this.setMessage(msg);
return this;
}
public Result<T> code(Integer code){
this.setCode(code);
return this;
}
public boolean isOk() {
if(this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {
return true;
}
return false;
}
}
4.5 控制层
package com.dfp.aliyunossdemo.controller;
import com.dfp.aliyunossdemo.enums.Result;
import com.dfp.aliyunossdemo.enums.ResultCodeEnum;
import com.dfp.aliyunossdemo.service.FileUploadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import static com.dfp.aliyunossdemo.enums.ResultCodeEnum.DATA_ERROR;
import static com.dfp.aliyunossdemo.enums.ResultCodeEnum.PARAM_ERROR;
@Api(description = "阿里云测试文档Api")
@RestController
@RequestMapping("/api/file")
public class TestController {
@Autowired
private FileUploadService fileUploadService;
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
public Result upload(MultipartFile file) {
String returnFileUrl = null;
if (file != null) {
returnFileUrl = fileUploadService.upload(file);
if (StringUtils.isEmpty(returnFileUrl)){
// 返回路径为空表示异常
return Result.fail(DATA_ERROR);
}
return Result.ok(returnFileUrl);
} else {
return Result.fail(PARAM_ERROR);
}
}
@PostMapping("/down/{filename}")
public Result DownLoad(@PathVariable String filename , HttpServletResponse response){
return null;
}
/**
* 文件删除api
* @param: fileName
* @return: com.alibaba.fastjson.JSONObject
* @create: 2020/10/31 17:35
* @author: csp1999
*/
@ApiOperation(value = "文件删除")
@GetMapping("/delete/{fileName}")
public JSONObject DeleteFile(@PathVariable("fileName") String fileName) {
JSONObject jsonObject = new JSONObject();
String status = fileUploadService.delete(fileName);
return null;
}
}
运行项目测试
打开sw2进行测试 localhost:+项目端口号
在浏览器输入这个网址或者在你的阿里云oss控制台看这个图片又就表示成功了