文章目录
什么是阿里云OSS
阿里云 OSS为您提供基于网络的数据存取服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种结构化或非结构化数据文件。
在使用阿里云 OSS 之前,您需要了解 OSS 的几个基本概念。阿里云 OSS 将数据文件以对象(object)的形式上传到存储空间(bucket)中。 您可以创建一个或者多个存储空间,然后向每个存储空间中添加一个或多个文件。您可以通过获取已上传文件的地址进行文件的分享和下载。您还可以通过修改存储空间或文件的属性或元信息来设置相
应的访问权限。
您可以通过阿里云管理控制台执行基本和高级 OSS 任务,您还可以通过阿里云开发工具包或直接在应用程序中进行 RESTful API 调用执行基本和高级 OSS 任务。有关更多信息,本文档将向您介绍如何使用阿里云管理控制台来完成以下基本任务。
以上是我复制阿里云这样的
最近写项目遇上了上传的业务,中间经历了些许坎坷,写个博客总结一下。
开通OSS
阿里云官网
打开官网依次选择 产品-热门产品-对象存储oss
这里应该是立即开通,我已经开过了
开通后进入控制台
创建Bucket
创建Bucket的时候,会让你填写相关信息,一般来说我们只填名称和选择区域,其他都默认就好。
Bucket名称是唯一的,这个唯一同其他所有用户
区域就是你想把你东西存放到哪个地方,从功能来说,选哪个都一样。
选择完毕后,点击【确定】完成创建。
创建AccessKey
获取授权信息
第一次创建,会弹出这个东西。一般来说,个人的数据没有那么必要折腾,选择【继续使用AccessKey】。而如果是公司用的话,基于安全原因,一般选择【开始使用字用户AccessKey】
选择完毕后,点击【创建AccessKey】
然后他会向你发验证码,确认是否是本人操作,输入验证码后,就会得到相关的的 AccessKeyId 和 AccessKeySecret 了
demo
阿里云官方也提供了SDk示例 官方SDK
demo会根据实际项目开发的标准编写
pom.xml
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.13.2</version>
</dependency>
<!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.13</version>
</dependency>
配置文件
server:
port: 8089
servlet:
context-path: /
spring:
datasource:
url: jdbc:mysql:///alibaba?serverTimezone=GMT
username: root
password: root
thymeleaf:
prefix: classpath:/templates/pages/
suffix: .html
logging:
level:
com.alibaba: DEBUG
aliyun:
oss:
file:
endpoint: <<外网访问>>
keyid: <<AccessKey ID>>
keysecret: <<accessKeySecret>>
bucketname: <<Bucket>
folder: <<文件夹名>>
配置常量类读取配置信息
package com.alibaba.SpringBootDemo.entity;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConstanPropertiesUtils implements InitializingBean {
//读取配置文件内容
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
@Value("${aliyun.oss.file.folder}")
private String folder;
//定义公开静态常量
public static String END_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
public static String FOLDER;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
FOLDER = folder;
}
}
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>文件上传</h1>
<form method="post" action="/saveTbItemCat" enctype="multipart/form-data">
<input type="file" name="file" multiple="multiple"/><br/><br/>
<input type="submit" value="上传" /><br/>
</form>
</body>
</html>
单文件上传
controllrt
@PostMapping("saveTbItemCat")
public CommonResult saveTbItemCat(TbItemCat tbItemCat, MultipartFile file){
tbItemCatService.saveTbItemCat(tbItemCat,file);
return CommonResult.success("新增成功");
}
service
//新增产品分类
int saveTbItemCat(TbItemCat tbItemCat, MultipartFile file);
impl
@Override
public int saveTbItemCat(TbItemCat tbItemCat, MultipartFile file) {
//分类照片不能为空
if (StringUtils.isEmpty(file.getOriginalFilename())){
throw new ServiceException("请选择照片");
}
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = ConstanPropertiesUtils.END_POIND;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstanPropertiesUtils.BUCKET_NAME;
try {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 获取文件流。
InputStream inputStream = file.getInputStream();
// 获取文件上传名称
String fileName = file.getOriginalFilename();
//添加唯一值
String uuid = UUID.randomUUID().toString().replace("-", "");
//合并名称
fileName = uuid + fileName;
//把文件按照日期进行分类
String dataPath = new DateTime().toString("yyyy/MM/dd");
//合并名称
fileName = dataPath + "/" + fileName;
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传文件路径返回
String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
//将图片路径写入数据库
tbItemCat.setItemImage(url);
//将分类信息写入数据库
int rows = tbItemCatDao.insertTbItemCat(tbItemCat);
if (rows == 0) {
throw new ServiceException("保存失败");
}
return rows;
}catch (Exception e){
e.printStackTrace();
return 0;
}
}
测试
浏览器输入:http://localhost:8089/doLongin
删除文件
controller
@GetMapping("/delete")
public CommonResult delete(String url, Integer id){
tbItemCatService.deleteBatchIds(id);
tbItemCatService.removeFile(url);
return CommonResult.success("删除成功");
}
service
//删除产品分类
void deleteBatchIds(Integer id);
//删除分类中的图片
void removeFile(String url);
impl
@Override
public void deleteBatchIds(Integer ids) {
//TODO 检查当前删除的菜单,是否被别的地方引用
tbItemCatDao.deleteByids(ids);
}
@Override
public void removeFile(String url) {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = ConstanPropertiesUtils.END_POIND;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
// 填写Bucket名称。
String bucketName = ConstanPropertiesUtils.BUCKET_NAME;
String host = "https://" + bucketName + "." + endpoint + "/";
// 填写文件完整路径。文件完整路径中不能包含Bucket名称。
String objectName = url.substring(host.length());
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 删除文件或目录。如果要删除目录,目录必须为空。
ossClient.deleteObject(bucketName, objectName);
// 关闭OSSClient。
ossClient.shutdown();
}
批量上传
comtroller
@PostMapping("saveOss")
@ResponseBody
@ApiImplicitParams({
@ApiImplicitParam(name = "ordersn",value = "订单号",required = true)
})
public CommonResult saveOss(@RequestParam("file")MultipartFile[] file)throws Exception{
System.out.println("数组的长度为" + file.length);
for (int i = 0; i < file.length; i++){
String originalFilename = file[i].getOriginalFilename();
InputStream inputStream = file[i].getInputStream();
ossService.saveMemberInformation(originalFilename,inputStream);
}
return CommonResult.success("上传成功");
}
service
Object saveMemberInformation(String fileNames, InputStream inputStreams);
impl
@Override
public Object saveMemberInformation(String fileNames, InputStream inputStreams){
//通过工具类获取值
String endpoint = ConstanPropertiesUtils.END_POIND;
String accessKeyId = ConstanPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstanPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstanPropertiesUtils.BUCKET_NAME;
String folder = ConstanPropertiesUtils.FOLDER_INFORMATION;
//创建OSS客户端
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(
Arrays.asList(fileNames));
ConcurrentLinkedQueue<InputStream> streamConcurrentLinkedQueue = new ConcurrentLinkedQueue<>(
Arrays.asList(inputStreams));
Iterator<InputStream> inputStreamss = streamConcurrentLinkedQueue.iterator();
ConcurrentLinkedQueue c = new ConcurrentLinkedQueue();
for (Iterator<String> iterator = concurrentLinkedQueue.iterator();
iterator.hasNext() && inputStreamss.hasNext(); ) {
ossClient.putObject(new PutObjectRequest(bucketName, folder + fileNames, inputStreamss.next()));
c.add(fileNames);
System.out.println(fileNames);
String url = "https://" + bucketName + "." + endpoint + "/" + folder + fileNames;
System.out.println(url);
//数据库信息写入
Long token = JwtUtils.getMemberIdByJwtToken(request);
UmsMemberOrderInformation information = new UmsMemberOrderInformation();
information.setOrderSn(ordersn);
information.setFileName(fileNames);
information.setFilePath(url);
information.setMemberId(token);
information.setCreateTime(new Date());
information.setUpdateTime(new Date());
baseMapper.insert(information);
}
return (String[]) c.toArray(new String[0]);
} catch (Exception e) {
e.printStackTrace();
System.err.println(e.getMessage());
} finally {
ossClient.shutdown();
}
return null;
}