OSS是一个分布式的文件存储服务,在OSS中提供了很多对应上传下载的api供我们去调用完成对应的需求以及数据处理。
OSS官网:https://help.aliyun.com/product/31815.html
打开上方的oss网址,我们可以看到oss的所有的介绍(可以免费试用)
试用购买成功后我们去创建Bucket首先搜索OSS
1.Bucket是水桶的意思,那么我们的数据图片以及视频什么的可以当做水,所以我们先要创建水桶才能去装水~~
2.在创建Bucket的时候一定要把读写权限改为公共读(否则上传后访问不了图片)
Bucket名称自己随便起。
重点是读写权限 选择完成后我们在点击创建即可
创建完成后我们可以在bucket列表看到自己刚创建好的水桶(bucket)
1.首先导入OSS坐标
我这里用的是3.10.2的版本大家也可以去maven官网去找其他版本的OSS-SDK
https://mvnrepository.com/
<!--阿里oss 文件存储-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
2.在文档介绍中我们看可以看到OSS客户端对象需要一些参数来初始化
3.所以我们在代码中需要把以上这些参数都交给OSS客户端去初始化
所以我们这一步先创建OSS初始化类把OSS交给spring去管理
@Configuration
@ConfigurationProperties(prefix = "oss")
@Data
@Slf4j
public class AliyunConfig {
private final String endpoint;
private final String accessKeyId;
private final String accessKeySecret;
private final String bucketName;
private final String url;
@Bean
public OSS oSSClient() {
log.info("阿里云客户端已初始化 endpoint:[{}],accessKeyId:[{}]," +
"accessKeySecret:[{}],bucketName:[{}],urlPrefix:[{}]"
,endpoint,accessKeyId,accessKeySecret,bucketName,url);
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
4.配置yml文件properties文件也是可以的
如果使用properties要在OSS配置类要多个一个注解
@PropertySource(value = {“classpath:文件名称.properties”})
5.参数
accessKey
自己创建一个就行
1.在OSS文档中我们可以看到一个简单的快速入门
2.需要三个参数
bucketName:bucket名称(就是要装到哪个水桶里去)
objectName:这个参数的意思就是上传到OSS后的路径,我们可以根据时间分类或者日期等等都可以。比如:2021-1-11/123.jpg
new ByteArrayInputStream(content.getBytes()):这个参数就是文件的流
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
3.用上方代码上传成功后我们就可以在Bucket(水桶中找到对应的水)也就是刚传上来的图片
4.在OSS文档介绍中有很多的案例大家可以根据自己需求找到对应的案例然后稍微改一改就可以用的,比如 上传 断点续传 分片上传等等…
1.Controller
@Controller
@Api(value = "阿里云OSS文件存储服务器",description ="阿里云OSS文件存储服务器" )
public class FileUploadController {
@Autowired
private FileUploadService fileUploadService;
@RequestMapping(value = "/file/upload",method = RequestMethod.POST)
@ApiOperation("上传")
@ResponseBody
public FileUploadResult upload(@RequestParam("file") MultipartFile uploadFile) throws Exception {
return fileUploadService.upload(uploadFile);
}
@RequestMapping(value = "/file/delete",method = RequestMethod.GET)
@ApiOperation("删除")
@ResponseBody
@ApiImplicitParam(name = "文件目录名称",value = "比如:images/2020/11/22/1606034097781942.jpg")
public FileUploadResult delete(@RequestParam("fileName") String fileName) throws Exception {
return fileUploadService.delete(fileName);
}
@RequestMapping(value = "/file/list/{size}",method = RequestMethod.GET)
@ApiOperation("查询oss中全部文件")
@ResponseBody
public List<OSSObjectSummary> list(@PathVariable("size") String size) throws Exception {
return fileUploadService.list(size);
}
@RequestMapping(value = "/file/download",method = RequestMethod.GET)
@ApiOperation("下载")
@ResponseBody
@ApiImplicitParam(name = "文件目录名称",value = "比如:images/2020/11/22/1606034097781942.jpg")
public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) throws IOException {
//通知浏览器以附件形式下载
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO-8859-1"));
fileUploadService.exportOssFile(response.getOutputStream(),fileName);
}
}
2.Service
@Service
public class FileUploadService {
//效验上传的格式 可自己维护
private static final List<String> UPLOAD_TYPE = Stream.of(".bmp", ".jpg", ".jpeg", ".gif", ".png").collect(Collectors.toList());
@Autowired
private OSS ossClient;
@Autowired
private AliyunConfig aliyunConfig;
public FileUploadResult upload(MultipartFile uploadFile) throws IOException {
// 校验图片格式
boolean isLegal = false;
for (String type : UPLOAD_TYPE) {
if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),type)) {
isLegal = true;
break;
}
}
//封装Result对象,并且将文件的byte数组放置到result对象中
FileUploadResult fileUploadResult = new FileUploadResult();
if (!isLegal) {
fileUploadResult.setResponse("上传格式不支持...");
return fileUploadResult;
}
//文件新路径
String fileName = uploadFile.getOriginalFilename();
String filePath = getFilePath(fileName);
// 上传到阿里云
// 创建上传Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(uploadFile.getInputStream().available());
objectMetadata.setCacheControl("no-cache");//设置Cache-Control请求头,表示用户指定的HTTP请求/回复链的缓存行为:不经过本地缓存
objectMetadata.setHeader("Pragma", "no-cache");//设置页面不缓存
objectMetadata.setContentType(getcontentType(uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")+1)));
objectMetadata.setContentDisposition("inline;filename=" + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")+1) + "." + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".")));
try {
ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()),objectMetadata);
} catch (Exception e) {
e.printStackTrace();
//上传失败
fileUploadResult.setStatus("error");
return fileUploadResult;
}
fileUploadResult.setStatus("done");
fileUploadResult.setResponse("上传成功");
fileUploadResult.setName(this.aliyunConfig.getUrl() + "/" +filePath);
fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));
//todo 有兴趣的朋友们 可以把 OSS做成一个微服务供其他的服务去调用 根据返回的图片URL存到对应的数据库中
//todo this.aliyunConfig.getUrl() + "/" +filePath
return fileUploadResult;
}
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "images/" + dateTime.toString("yyyy")
+ "/" + dateTime.toString("MM") + "/"
+ dateTime.toString("dd") + "/" + System.currentTimeMillis() +
RandomUtils.nextInt(100, 9999) + "." +
StringUtils.substringAfterLast(sourceFileName, ".");
}
public List<OSSObjectSummary> list(String size) {
// 设置最大个数。
final int maxKeys = Integer.parseInt(size);
// 列举文件。
ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
return sums;
}
public FileUploadResult delete(String objectName) {
// 根据BucketName,objectName删除文件
ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);
FileUploadResult fileUploadResult = new FileUploadResult();
fileUploadResult.setName(objectName);
fileUploadResult.setStatus("removed");
fileUploadResult.setResponse("删除成功");
return fileUploadResult;
}
/**
* Description: 判断OSS服务文件上传时文件的contentType
* @param suffix 文件后缀
* @return String HTTP Content-type
*/
public static String getcontentType(String suffix) {
System.out.println("------------>文件格式为: " + suffix);
if (suffix.equalsIgnoreCase("bmp")) {
return "image/bmp";
} else if (suffix.equalsIgnoreCase("gif")) {
return "image/gif";
} else if(suffix.equalsIgnoreCase("jpg")){
return "image/jpg";
} else if (suffix.equalsIgnoreCase("jpeg")) {
return "image/jpeg";
} else if (suffix.equalsIgnoreCase("png")) {
return "image/png";
} else if (suffix.equalsIgnoreCase("html")) {
return "text/html";
} else if (suffix.equalsIgnoreCase("txt")) {
return "text/plain";
} else if (suffix.equalsIgnoreCase("vsd")) {
return "application/vnd.visio";
} else if (suffix.equalsIgnoreCase("pptx") || suffix.equalsIgnoreCase("ppt")) {
return "application/vnd.ms-powerpoint";
} else if (suffix.equalsIgnoreCase("docx") || suffix.equalsIgnoreCase("doc")) {
return "application/msword";
} else if (suffix.equalsIgnoreCase("xml")) {
return "text/xml";
} else if (suffix.equalsIgnoreCase("mp3")) {
return "audio/mp3";
} else if (suffix.equalsIgnoreCase("amr")) {
return "audio/amr";
} else {
return "text/plain";
}
}
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*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();
}
}
}
swagger-bootstrap-ui下期有时间教大家整合这个玩
比swagger官方版本好看点感觉。
OSS是一个分布式的文件存储服务,提供了很多api供我们去完成对应的上传下载等。大家可以根据OSS文档中的一些案例去完成对应的需求。今儿就到这吧,如有问题欢迎留言。