阿里云(OSS)文件上传和删除
阿里云(OSS)文件上传和删除
·
一、准备jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.0</version>
</dependency>
二、controller层
/**
* 上传
* @param file
* @return
* @throws IOException
* @throws InterruptedException
*/
@PostMapping("/aliyun/upload")
public String aliyunUpload(MultipartFile file) throws IOException, InterruptedException {
AliyunOSS aliyunOSS = new AliyunOSS();
String fileName = DateUtil.currentSeconds() + file.getOriginalFilename();
String result = aliyunOSS.upLoadFile("zhong", fileName, file.getInputStream());
//todo 批量上传的时候容易出现问题,最好是控制一下时间
Thread.sleep(1000);
return result;
}
/**
* 删除
* @param fileUrl
* @return
*/
@PostMapping("/aliyun/upload/delete")
public Boolean aliyunUploadDetele(String fileUrl) {
boolean flag = AliyunOSS.deleteFile(fileUrl);
return flag;
}
三、上传类和方法
@Component
public class AliyunOSS {
private static final String endpoint = "http://oss-cn-beijing.aliyuncs.com/";//endpoint 地址
private static final String accessKeyId = "AccessKey ID";//AccessKey ID
private static final String accessKeySecret = "AccessKey Secret";//AccessKey Secret
private static final String bucketName = "Bucket名称";//Bucket名称
private static final String uploadFile = "test/";//上传文件夹名称
private static final String imageBaseUrl = "https://huiphoto.oss-cn-beijing.aliyuncs.com/";//域名地址
protected ThreadPoolExecutor executor;
/**
* 上传文件到阿里云
*
* @param fileName 文件名,前面不用加/线
* @param inputStream
* @return
*/
public String upLoadFile(String module, String fileName, InputStream inputStream) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
StrBuilder builder = StrBuilder.create();
//新文件名
String newFilePath = builder
.append(uploadFile)
.append(module)
.append("/")
.append(DateUtil.format(new Date(), "yyyy/MM/dd"))
.append("/")
.append(fileName)
.toString();
int processors = Runtime.getRuntime().availableProcessors();
executor = new ThreadPoolExecutor(processors * 5, processors * 10, 60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(processors * 100), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String finalNewFilePath = newFilePath;
FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
@Override
public String call() {
try {
//内容准备
InputStream stream = inputStream;
ossClient.putObject(bucketName, finalNewFilePath, stream);
} catch (OSSException oe) {
oe.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
return "";
}
});
executor.execute(future);
//关闭线程池
if (!executor.isShutdown()) {
executor.shutdown();
}
return imageBaseUrl + finalNewFilePath;
}
public static boolean deleteFile(String filePath) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String aliPath = filePath.replace(imageBaseUrl, "");
boolean exist = ossClient.doesObjectExist(bucketName, aliPath);
if (!exist) {
return false;
}
ossClient.deleteObject(bucketName, aliPath);
ossClient.shutdown();
return true;
}
}
四、参数讲解
endpoint(地域节点)和imageBaseUrl(bucket域名):可以在阿里云上获取这两个参数内容
打开阿里云->进入对象存储->点击你创建的bucket->概览
accessKeyId和accessKeySecret:这两个参数就是AccessKey ID和AccessKey Secret
bucketName:阿里云上bucket的名称
uploadFile:文件夹地址,如果没有会自动创建
五、结果
利用postman调用
更多推荐
所有评论(0)