天天看点

亚马逊云COS组件使用实践总结

【1】创建目录对象

创建文件–带有文件目录 如 ​

​test1/test3/hello.txt​

​。如果目标对象已经存在,则会进行覆盖。

AmazonS3 singleAmazonS3 = this.getSingleAmazonS3();
// 创建文件--带有文件目录  如 test1/test3/hello.txt
Bucket bucket = cosFileSystem.getBucket(singleAmazonS3);
singleAmazonS3.putObject(bucket.getName(),"test1/test3/hello.txt",new File("./hello.txt"));      

通过控制台登录查看,会看到如下结构:

亚马逊云COS组件使用实践总结

注意,这里目标对象的key建议不要以​​

​/​

​​开头,否则bucket内会有一个目录​

​/​

​​,这个不符合COS的规范。比如​

​/test1/test3/hello.txt​

​​,其最终效果不是我们想象的​

​test1 -- test3 目录下有个hello.txt​

​​,而是​

​/ -- test1---test3 下有个hello.txt​

​。

对象名称如果带有目录,那么应该是​

​a/b/hello.txt​

​​格式,​

​a\b\hello.txt​

​格式是错误的,不支持的。

【2】获取文件对象

① 通过key直接获取文件对象本身

假设文件对象名称为​

​test1/test4/hello.txt​

​,那么如下所示可以拿到文件对象然后包装为流。之后就是最基本的IO操作了,可以实现文件下载。

S3Object amazonS3Object = singleAmazonS3.getObject(bucket.getName(), "test1/test4/hello.txt");
S3ObjectInputStream objectInputStream = amazonS3Object.getObjectContent();
BufferedInputStream bufferedInputStream = new BufferedInputStream(objectInputStream);      

② 获取文件下载链接

Bucket bucket = getBucket(singleAmazonS3);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket.getName(), "test1/test4/hello.txt");
URL url = singleAmazonS3.generatePresignedUrl(request);
logger.debug("{}生成的文件下载链接为:{}",saveName,url);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(15000);
connection.connect();
InputStream urlInputStream = connection.getInputStream();      

③ 判断文件对象是否存

AmazonS3 singleAmazonS3 = this.getSingleAmazonS3();
Bucket bucket = singleAmazonS3.listBuckets().get(0);
// true  or  false
boolean exist = singleAmazonS3.doesObjectExist(bucket.getName(), "111.txt");      

【3】异常解决

// 原始上传
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , new ObjectMetadata());

//修改为如下 -也就是说给objectMetadata设置长度
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , objectMetadata);      

继续阅读