添加依赖:
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
在yml中配置:
oos:
endpoint: oss-cn-hangzhou.aliyuncs.com
keyid: #填写AccessKey
keysecret: # 填写Accesssecret
bucketname: # bucket名称
filehost: #bucket下文件夹的路径
配置注入:
@Data
@Component
@ConfigurationProperties(prefix = "oos")
public class ConstantProperties {
private String endpoint;
private String keyid;
private String keysecret;
private String bucketname;
private String filehost;
}
响应结果实体类:
public class ImageUploadVo {
private int uploaded;
private String fileName;
private String url;
}
封装工具类:
@Service
@Slf4j
public class AliyunOSSUtil {
@Autowired
private ConstantProperties constantProperties;
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
/**
* 上传
*
* @param file
* @return
*/
public String upload(File file) {
log.info("=========>OSS文件上传开始:" + file.getName());
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
String fileHost = constantProperties.getFilehost();
System.out.println(endpoint + "endpoint");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
if (null == file) {
return null;
}
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
String fileUrl=null;
try {
//容器不存在,就创建
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
//创建文件路径
fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
//上传文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
//设置权限 这里是公开读
ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicReadWrite);
if (null != result) {
log.info("==========>OSS文件上传成功,OSS地址:" + fileUrl);
return fileUrl;
}
} catch (OSSException oe) {
log.error(oe.getMessage());
} catch (ClientException ce) {
log.error(ce.getMessage());
} finally {
//关闭
ossClient.shutdown();
}
return null;
}
/**
* 上传方法
*
* @param file
* @return
*/
public ImageUploadVo commonUpload(MultipartFile file) {
log.info("=========>文件上传");
File newFile = null;
String uploadUrl = null;
ImageUploadVo imageUploadVo = null;
try {
if (null != file) {
String filename = file.getOriginalFilename();
if (!"".equals(filename.trim())) {
newFile = new File(filename);
FileOutputStream os = new FileOutputStream(newFile);
os.write(file.getBytes());
os.close();
file.transferTo(newFile);
//上传到OSS
uploadUrl = upload(newFile);
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
newFile.delete();
imageUploadVo = new ImageUploadVo();
imageUploadVo.setUploaded(1);
imageUploadVo.setFileName(uploadUrl);
imageUploadVo.setUrl("https://" + constantProperties.getBucketname() + "." + constantProperties.getEndpoint() + "/" + uploadUrl);
}
return imageUploadVo;
}
/**
* 删除
*
* @param fileKey
* @return
*/
public String deleteBlog(String fileKey) {
log.info("=========>OSS文件删除开始");
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
String bucketName = constantProperties.getBucketname();
String fileHost = constantProperties.getFilehost();
try {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
if (!ossClient.doesBucketExist(bucketName)) {
log.info("==============>您的Bucket不存在");
return "您的Bucket不存在";
} else {
log.info("==============>开始删除Object");
ossClient.deleteObject(bucketName, fileKey);
log.info("==============>Object删除成功:" + fileKey);
return "==============>Object删除成功:" + fileKey;
}
} catch (Exception ex) {
log.info("删除Object失败", ex);
return "删除Object失败";
}
}
/**
* 查询文件名列表
*
* @param bucketName
* @return
*/
public List<String> getObjectList(String bucketName) {
List<String> listRe = new ArrayList<>();
String endpoint = constantProperties.getEndpoint();
String accessKeyId = constantProperties.getKeyid();
String accessKeySecret = constantProperties.getKeysecret();
try {
log.info("===========>查询文件名列表");
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
//列出指定目录下今天所有文件
listObjectsRequest.setPrefix(constantProperties.getFilehost()+"/" + format.format(new Date()) + "/");
ObjectListing list = ossClient.listObjects(listObjectsRequest);
for (OSSObjectSummary objectSummary : list.getObjectSummaries()) {
System.out.println(objectSummary.getKey());
listRe.add(objectSummary.getKey());
}
return listRe;
} catch (Exception ex) {
log.info("==========>查询列表失败", ex);
return new ArrayList<>();
}
}
}
代码就已经写完了,接下来就可以调用了:
@Autowired
private AliyunOSSUtil aliyunOSSUtil;
@Autowired
private ConstantProperties constantProperties;
/**
* 上传图片(响应图片访问完整路径)
*
* @param file
* @return
*/
@PostMapping(value = "/ckeditorUpload", produces = "application/json; charset=UTF-8")
public ResponseEntity<ImageUploadVo> ckeditorUpload(@RequestParam("upload") MultipartFile file) {
ImageUploadVo imageUploadVo = aliyunOSSUtil.commonUpload(file);
return ResponseEntity.ok(imageUploadVo);
}
/**
* 获取图片列表
*
* @return
*/
@GetMapping(value = "/getObjectList", produces = "application/json; charset=UTF-8")
public ResponseEntity<List<String>> getObjectList() {
String bucketName = constantProperties.getBucketname();
System.out.println(bucketName);
List<String> objectList = aliyunOSSUtil.getObjectList(bucketName);
return ResponseEntity.ok(objectList);
}
/**
* 删除图片
*
* @param key:图片的目录路径 例:test/2021-03-05/261aeb468ff54ad592b9ec8206c0b64e-6D8A0426.JPG
* @return
*/
@DeleteMapping(value = "/delete", produces = "application/json; charset=UTF-8")
public ResponseEntity<String> deleteBlog(@RequestParam("key") String key) {
aliyunOSSUtil.deleteBlog(key);
return ResponseEntity.ok("删除成功");
}
补充 :yml配置上传的文件
spring
servlet:
multipart:
enabled: true
max-file-size: 30MB
max-request-size: 30MB