【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"));
通过控制台登录查看,会看到如下结构:
注意,这里目标对象的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);
② 获取文件下载链接
如下所示根据桶名称和文件对象名称获取文件下载链接,然后通过HttpURLConnection 获取流。
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】异常解决
(1) No content length specified for stream data. Stream contents will be buffered in memory and could
// 原始上传
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , new ObjectMetadata());
//修改为如下 -也就是说给objectMetadata设置长度
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(inputStream.available());
singleAmazonS3.putObject(bucket.getName(), saveName,inputStream , objectMetadata);