阿里云之对象存储OSS
引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
初始化
private static OSS initOSS(){
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-chengdu.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "LTAI4GJsHGGQGoeFdZjg69aY";
String accessKeySecret = "94dnIJHDBO5YlrFshWhHvsGlhpkpdv";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
return ossClient;
}
文件上传
public static void main(String[] args) {
uploadFile();
}
private static void uploadFile(){
//指定存储空间(bucketName)
String bucketName = "bar-app";
FileInputStream fileInputStream=null;
try {
fileInputStream = new FileInputStream("D:\\1.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//初始化
OSS ossClient = initOSS();
//上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(test.png)
ossClient.putObject(bucketName,"test.png",fileInputStream);
// 关闭OSSClient。
ossClient.shutdown();
}
下载文件
public static void main(String[] args) {
//uploadFile();
downloadFile();
}
private static void downloadFile(){
//指定存储空间(bucketName)
String bucketName = "bar-app";
//指定下载文件名Path,默认根目录
String fileName = "test.png";
//初始化
OSS ossClient = initOSS();
// 下载Object到本地文件,并保存到指定的本地路径中。如果指定的本地文件存在会覆盖,不存在则新建。
// 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
ossClient.getObject(new GetObjectRequest(bucketName, fileName), new File("D:\\2.jpg"));
// 关闭OSSClient。
ossClient.shutdown();
}
文件管理
判断文件是否存在
// 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,如果为true则忽略302重定向或镜像;如果
为false,则考虑302重定向或镜像。
boolean found = ossClient.doesObjectExist("<yourBucketName>", "<yourObjectName>");
管理文件访问权限
文件的访问权限优先级高于存储空间的访问权限。
文件的访问权限有以下四种:
访问权限 | 描述 | 访问权限值 |
---|---|---|
继承Bucket | 文件遵循存储空间的访问权限。 | CannedAccessControlList.Default |
私有 | 文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。 | CannedAccessControlList.Private |
公共读 | 文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。 | CannedAccessControlList.PublicRead |
公共读写 | 所有用户都有该文件的读写权限。请谨慎使用该权限。 | CannedAccessControlList.PublicReadWrite |
1.设置文件访问权限
// 设置文件的访问权限为公共读。
ossClient.setObjectAcl("<yourBucketName>", "<yourObjectName>", CannedAccessControlList.PublicRead);
2.获取文件访问权限
// 获取文件的访问权限。
ObjectAcl objectAcl = ossClient.getObjectAcl("<yourBucketName>", "<yourObjectName>");
System.out.println(objectAcl.getPermission().toString());
删除文件
1.删除单个文件
// 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
ossClient.deleteObject(bucketName, objectName);
2.删除多个文件
每次最多删除1000个文件。有两种返回模式:
详细(verbose)模式:返回删除成功的文件列表。默认为详细模式。
简单(quiet)模式:返回删除失败的文件列表。
DeleteObjectsRequest的参数如下:
参数 | 描述 | 方法 |
---|---|---|
Keys | 需要删除的文件。 | setKeys(List) |
quiet | 返回模式。true表示简单模式,false表示详细模式。默认为详细模式。 | setQuiet(boolean) |
encodingType | 对返回的文件名称进行编码。编码类型目前仅支持url。 | setEncodingType(String) |
DeleteObjectsResult的参数如下:
参数 | 描述 | 方法 |
---|---|---|
deletedObjects | 删除结果。详细模式下为删除成功的文件列表,简单模式下为删除失败的文件列表。 | List getDeletedObjects() |
encodingType | deletedObjects中文件名称的编码,为空表示没有编码。 | getEncodingType() |
// 删除文件。key等同于ObjectName,表示删除OSS文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
List<String> keys = new ArrayList<String>();
keys.add("key0");
keys.add("key1");
keys.add("key2");
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
追加上传
# oss
oss.accessKeyId=LTAI5tQxPchWFZdGYxP5r7CR
oss.accessKeySecret=3wgedYKtRZBd2OzyJOl5bZkGQwfV86
oss.endpoint=http://oss-cn-shenzhen.aliyuncs.com
oss.domain=http://cj-books.oss-cn-shenzhen.aliyuncs.com/
oss.bucket=cj-books
@RestController
@RequestMapping("/file")
public class OssController {
@Resource
private IFileService fileService;
@PostMapping("/oss-append")
public HashMap fileUpload(@RequestBody JSONObject jsonObject) throws Exception {
return fileService.ossUpload(jsonObject);
}
}
@Service
public class FileServiceImpl implements IFileService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${oss.accessKeyId}")
private String accessKeyId;
@Value("${oss.accessKeySecret}")
private String accessKeySecret;
@Value("${oss.endpoint}")
private String endpoint;
@Value("${oss.bucket}")
private String bucket;
@Value("${oss.domain}")
private String ossDomain;
@Autowired
private FileMapper fileMapper;
@Override
public HashMap ossUpload(JSONObject jsonObject) throws IOException {
logger.info("上传文件开始....");
String key = jsonObject.getString("key");
String suffix = jsonObject.getString("suffix");
String shardBase64 = jsonObject.getString("shard");
Integer shardIndex = jsonObject.getInteger("shardIndex");
Integer shardTotal = jsonObject.getInteger("shardTotal");
Long size = jsonObject.getLong("size");
String name = jsonObject.getString("name");
Long shardSize = jsonObject.getLong("shardSize");
MultipartFile shard = Base64ToMultipartFile.base64ToMultipart(shardBase64);
ZdFile zdFile = new ZdFile();
zdFile.setFileKey(key);
zdFile.setSuffix(suffix);
zdFile.setShardIndex(shardIndex);
zdFile.setShardTotal(shardTotal);
zdFile.setSize(size);
zdFile.setName(name);
zdFile.setShardSize(shardSize);
String dir = LocalDate.now().toString();
// 2021-07-20/211772d095215cd0a88e4035341d88ea.png
String path = new StringBuffer(dir).append("/").append(key).append(".").append(suffix).toString();
// 创建ossClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
meta.setContentType("text/plain");
// 通过AppendObjectRequest设置多个参数。
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucket, path, new ByteArrayInputStream(shard.getBytes()), meta);
// 通过AppendObjectRequest设置单个参数。
// 设置存储空间名称。
//appendObjectRequest.setBucketName("<yourBucketName>");
// 设置文件名称。
//appendObjectRequest.setKey("<yourObjectName>");
// 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为InputStream类型。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 设置待追加的内容。有两种可选类型:InputStream类型和File类型。这里为File类型。
//appendObjectRequest.setFile(new File("<yourLocalFile>"));
// 指定文件的元信息,第一次追加时有效。
//appendObjectRequest.setMetadata(meta);
// 设置文件的追加位置。
appendObjectRequest.setPosition(((shardIndex - 1) * shardSize));
ossClient.appendObject(appendObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
zdFile.setPath(path);
QueryWrapper<ZdFile> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("file_key", zdFile.getFileKey());
ZdFile selectOne = fileMapper.selectOne(queryWrapper);
if (selectOne != null) {
selectOne.setShardIndex(shardIndex);
fileMapper.updateById(selectOne);
} else {
fileMapper.insert(zdFile);
}
zdFile.setPath(ossDomain + path);
return BaseUtil.back(1, zdFile);
}
}