开发者社区 问答 正文

Java-SDK之如何实现上传文件(二)?


用户自定义元信息


OSS支持用户自定义Object的元信息,对Object进行描述。

  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String content = "Hello OSS";
  7. // 创建OSSClient实例
  8. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  9. // 创建上传Object的Metadata
  10. ObjectMetadata meta = new ObjectMetadata();
  11. // 设置自定义元信息name的值为my-data
  12. meta.addUserMetadata("property", "property-value");
  13. // 上传文件
  14. ossClient.putObject("<yourBucketName>", "<yourKey>", new ByteArrayInputStream(content.getBytes()), meta);
  15. // 关闭client
  16. ossClient.shutdown();

提示:
  • 在上面代码中,用户自定义了一个名称为“property”,值为“property-value”的元信息;
  • 文件的元信息可以通过OSSClient.getObjectMetadata获取;
  • 下载文件的时,文件的元信息也会同时下载;
  • 一个文件可以有多个元信息,总大小不能超过8KB。


创建模拟文件夹


OSS是没有文件夹这个概念的,所有元素都是以Object来存储。创建模拟文件夹本质上来说是创建了一个size为0的Object。对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。
  1. // endpoint以杭州为例,其它region请按实际情况填写
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. // 创建OSSClient实例
  7. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  8. final String keySuffixWithSlash = "parent_directory/";
  9. ossClient.putObject("<bucketName>", keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
  10. // 关闭client
  11. ossClient.shutdown();

提示:
  • 创建模拟文件夹本质上来说是创建了一个名字以“/”结尾的文件;
  • 对于这个文件照样可以上传下载,只是控制台会对以“/”结尾的文件以文件夹的方式展示;
  • 多级目录创建最后一级即可,比如dir1/dir2/dir3/,创建dir1/dir2/dir3/即可,dir1/、dir1/dir2/不需要创建;
  • 更多内容请参考 管理文件


追加上传


简单上传,分片上传,断点续传上传,创建的Object都是Normal类型,这种Object在上传结束之后内容就是固定的,只能读取,不能修改。如果Object内容发生了改变,只能重新上传同名的Object来覆盖之前的内容,这也是OSS和普通文件系统使用的一个重大区别。正因为这种特性,在很多应用场景下会很不方便,典型比如视频监控、视频直播领域等,视频数据在实时的不断产生。
OSS提供了用户通过追加上传(Append Object)的方式在一个Object后面直接追加内容的功能。通过这种方式操作的Object的类型为Appendable Object,而其他的方式上传的Object类型为Normal Object。每次追加上传的数据都能够即时可读。
您可以使用OSSClient.appendObject追加上传文件。
  1. AppendObjectResult appendObject(AppendObjectRequest appendObjectRequest)

AppendObjectRequest可设置参数如下:
参数作用方法
BucketNamebucket名称setBucketName(String bucketName)
Keyobject名称setKey(String key)
InputStream待追加的内容,InputStream/File二选一setInputStream(InputStream inputStream)
File待追加的内容,InputStream/File二选一setFile(File file)
ObjectMetadata指定Object的元信息,第一次追加时有效setMetadata(ObjectMetadata metadata)
PositionObject追加位置setPosition(Long position)

AppendObjectResult的参数如下:
参数含义方法
nextPosition指明下一次请求应当提供的position。实际上就是当前Object长度。Long getNextPosition()
objectCRC64Object的64位CRC值。该64位CRC根据ECMA-182标准计算得出String getObjectCRC64()

提示:
  • 追加上传的完整代码请参考:GitHub

展开
收起
青衫无名 2017-10-18 10:44:12 1962 分享 版权
0 条回答
写回答
取消 提交回答