1.OSS?
对象存储。
2.登录阿里云 控制台:
https://account.aliyun.com/login/qr_login.htm
3开启OSS服务
4.创建Bucket 列表(类似于一个大桶,也可以说是根目录)
5.root账户所有的权限是所有的aliyun权限,aliyun建议我们开启子用户AccessKey
在控制台登录需要在RAM访问控制中找到子账户的登录地址
编程访问
启用 Accesskey ID和 Accesskey Secret,支持通过API或其他开发工具访问
6.创建用户组,加入用户组,赋值OSS的权限。
7.生成子账户的Accesskey并记录
OSS如何获取永久有效的URL
私有属性文件的URL无法设置成永久有效的,若需要永久有效的URL您可以把文件改为公共读的属性。操作方法如下:
您可点此进入OSS控制台,在对应Bucket-文件管理中找到要修改权限的文件,点击详细,把文件ACL设置为公共读,设置为公共读权限后以文件名结尾的URL即为永久URL。
温馨提示:设置公共读后,任何人都可以通过该URL进行访问,这有可能造成您数据的外泄以及费用激增,请谨慎操作。
8.Spring集成OSS
pom.xml
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
application.yml
aliyun:
#节点 无需http://或https:// 只需//后面的网址
ENDPOINT: oss-cn-*******.aliyuncs.com
#访问密钥ID
ACCESSKEYID: ********************
ACCESSKEYSECRET: ***********
#bucket名
BUCKETNAME: **************
重写OSS OssClient
/**
* 功能描述:读取配置文件类
*
* @author:hdh
* @date: 2021/2/5 10:39
*/
@Data
@Configuration
public class OssClientConfig {
@Value("${aliyun.ENDPOINT}")
public String ENDPOINT;
@Value("${aliyun.ACCESSKEYID}")
public String ACCESSKEYID;
@Value("${aliyun.ACCESSKEYSECRET}")
public String ACCESSKEYSECRET;
@Value("${aliyun.BUCKETNAME}")
public String BUCKETNAME;
@Bean
public OSS ossClient() {
return new OSSClientBuilder().build(ENDPOINT, ACCESSKEYID, ACCESSKEYSECRET);
}
@Bean
public String bucketName() {
return BUCKETNAME;
}
}
封装OSSutils
/**
* 功能描述:oss封装工具类
*
* @author:hdh
* @date: 2021/2/5 10:39
*/
@Component
public class OSSUtils {
/**
* oss客户端
*/
@Autowired
@Qualifier("ossClient")
private OSS ossClient;
@Autowired
@Qualifier("bucketName")
private String BUCKEN_NAME;
/**
* @param url URL
* @param objectName 上传文件目录和(包括文件名)例如“test/index.html”
* @return void 返回类型
* @throws
* @Title: uploadByNetworkStream
* @Description: 通过网络流上传文件
*/
public void uploadByNetworkStream(URL url, String objectName) {
try {
InputStream inputStream = url.openStream();
ossClient.putObject(BUCKEN_NAME, objectName, inputStream);
ossClient.shutdown();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
/**
* @param inputStream 输入流
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
* @Title: uploadByInputStream
* @Description: 通过输入流上传文件
*/
public void uploadByInputStream(InputStream inputStream,
String objectName) {
ossClient.putObject(BUCKEN_NAME, objectName, inputStream);
}
/**
* @param file 上传的文件
* @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
* @return void 返回类型
* @throws
* @Title: uploadByFile
* @Description: 通过file上传文件
*/
public PutObjectResult uploadByFile(File file, String objectName) {
try {
PutObjectResult putObjectResult = ossClient.putObject(BUCKEN_NAME, objectName, file);
return putObjectResult;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return null;
}
/**
* @param key 文件路径/名称,例如“test/a.txt”
* @return void 返回类型
* @throws
* @Title: deleteFile
* @Description: 根据key删除oss服务器上的文件
*/
public void deleteFile(String key) {
ossClient.deleteObject(BUCKEN_NAME, key);
}
/**
* @param key 文件路径和名称
* @return InputStream 文件输入流
* @throws
* @Title: getInputStreamByOSS
* @Description:根据key获取服务器上的文件的输入流
*/
public InputStream getInputStreamByOSS(String key) {
InputStream content = null;
try {
OSSObject ossObj = ossClient.getObject(BUCKEN_NAME, key);
content = ossObj.getObjectContent();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
* @param ossClient oss客户端
* @return List<String> 文件路径和大小集合
* @throws
* @Title: queryAllObject
* @Description: 查询某个bucket里面的所有文件
*/
public List<String> queryAllObject(OSSClient ossClient) {
List<String> results = new ArrayList<String>();
try {
// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
ObjectListing objectListing = ossClient.listObjects(BUCKEN_NAME);
// objectListing.getObjectSummaries获取所有文件的描述信息。
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
results.add(" - " + objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return results;
}
/**
* @param fielURL:图片地址
* @Description:
* @Author: hdh
* @Date: 2021/2/7
* @return: null
**/
public String getOSSUrl(String fielURL) {
// 设置URL过期时间为1小时 若是永久有效 不需要设置时间
//Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
GeneratePresignedUrlRequest generatePresignedUrlRequest;
generatePresignedUrlRequest = new GeneratePresignedUrlRequest(BUCKEN_NAME, fielURL);
//generatePresignedUrlRequest.setExpiration(expiration);
URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
return url.toString();
}
}
MultipartFileToFile文件流转换类
/**
* @ClassName MultipartFileToFile
* @Description MultipartFile转fie
* @Author TongGuoBo
* @Date 2019/6/19 13:48
**/
public class MultipartFileToFile {
/**
* MultipartFile 转 File
*
* @param file
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
//获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除本地临时文件
* @param file
*/
public static void delteTempFile(File file) {
if (file != null) {
File del = new File(file.toURI());
del.delete();
}
}
}