java操作阿里云OSS服务器分布式存储,实现文件和图片的上传,下载和删除。
阿里云存储配置
server.id=01
#参数根据自己阿里云OSS存储服务器进行配置
#阿里云API的外网域名
ENDPOINT = oss-cn-beijing.aliyuncs.com
#阿里云API的密钥Access Key ID
ACCESS_KEY_ID = ****
#阿里云API的密钥Access Key Secret
ACCESS_KEY_SECRET = ****
#阿里云API的bucket名称
BACKET_NAME = ****
#阿里云API的文件夹名称
FOLDER=aiwork/
实现文件和图片的上传,下载和删除
/**
* 创建存储空间
* @param ossClient OSS连接
* @param bucketName 存储空间
* @return
*/
public static String createBucketName(OSSClient ossClient,String bucketName){
//存储空间
final String bucketNames=bucketName;
if(!ossClient.doesBucketExist(bucketName)){
//创建存储空间
Bucket bucket=ossClient.createBucket(bucketName);
logger.info("创建存储空间成功");
return bucket.getName();
}
return bucketNames;
}
/**
* 删除存储空间buckName
* @param ossClient oss对象
* @param bucketName 存储空间
*/
public static void deleteBucket(OSSClient ossClient, String bucketName){
ossClient.deleteBucket(bucketName);
logger.info("删除" + bucketName + "Bucket成功");
}
/**
* 创建模拟文件夹
* @param ossClient oss连接
* @param bucketName 存储空间
* @param folder 模拟文件夹名如"qj_nanjing/"
* @return 文件夹名
*/
public static String createFolder(OSSClient ossClient,String bucketName,String folder){
//文件夹名
final String keySuffixWithSlash =folder;
//判断文件夹是否存在,不存在则创建
if(!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)){
//创建文件夹
ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
logger.info("创建文件夹成功");
//得到文件夹名
OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
String fileDir=object.getKey();
return fileDir;
}
return keySuffixWithSlash;
}
/**
* 根据key删除OSS服务器上的文件
* @param ossClient oss连接
* @param bucketName 存储空间
* @param folder 模拟文件夹名 如"qj_nanjing/"
* @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
*/
public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key){
ossClient.deleteObject(bucketName, folder + key);
logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");
}
/**
* 上传图片至OSS
* @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
* @return String 返回的唯一MD5数字签名
* */
public static String uploadObject2OSS(File file,Boolean b) {
String bucketName = BACKET_NAME;
String folder = FOLDER;
String key =ACCESS_KEY_ID;
OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();
String url = null;
try {
//以输入流的形式上传文件
InputStream is = new FileInputStream(file);
//文件名
String fileName;
if(b){
//true的话 正常逻辑
fileName = UUID.randomUUID()+file.getName();
}else {
//false表示三星逻辑
fileName = file.getName();
}
//文件大小
Long fileSize = file.length();
//创建上传Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
//上传的文件的长度
metadata.setContentLength(is.available());
//指定该Object被下载时的网页的缓存行为
metadata.setCacheControl("no-cache");
//指定该Object下设置Header
metadata.setHeader("Pragma", "no-cache");
//指定该Object被下载时的内容编码格式
metadata.setContentEncoding("utf-8");
//文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
//如果没有扩展名则填默认值application/octet-stream
metadata.setContentType(getContentType(fileName));
//指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
//上传文件 (上传文件流的形式)
PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
//解析结果
//resultStr = putResult.getETag();
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
url = ossClient.generatePresignedUrl(bucketName,folder + fileName,expiration).toString();
} catch (Exception e) {
e.printStackTrace();
logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
}finally {
ossClient.shutdown();
}
return url;
}
/**
* 上传图片至OSS
* @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
* @return String 返回的唯一MD5数字签名
* */
public static String uploadMultipartFile2OSS(MultipartFile file) {
logger.info("文件后缀...:"+file.getOriginalFilename());
String bucketName = BACKET_NAME;
String folder = FOLDER;
String key =ACCESS_KEY_ID;
OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();
String url = null;
try {
//以输入流的形式上传文件
InputStream is = file.getInputStream();
//文件名
// String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")).toLowerCase();
String fileName = UUID.randomUUID()+file.getOriginalFilename();
// String fileName = file.getName();
//文件大小
Long fileSize = file.getSize();
//创建上传Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
//上传的文件的长度
metadata.setContentLength(is.available());
//指定该Object被下载时的网页的缓存行为
metadata.setCacheControl("no-cache");
//指定该Object下设置Header
metadata.setHeader("Pragma", "no-cache");
//指定该Object被下载时的内容编码格式
metadata.setContentEncoding("utf-8");
//文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
//如果没有扩展名则填默认值application/octet-stream
metadata.setContentType(getContentType(fileName));
//指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
//上传文件 (上传文件流的形式)
PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
//解析结果
//resultStr = putResult.getETag();
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
url = ossClient.generatePresignedUrl(bucketName,folder + fileName,expiration).toString();
} catch (Exception e) {
e.printStackTrace();
logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
}finally {
ossClient.shutdown();
}
return url;
}