概述
本文主要介绍对象存储部分metadata。
欢迎交流沟通ceph和对象存储相关知识
自定义元数据x-amz-meta-*
使用自定义元数据时,需要注意自定义元数据大小限制为2KB
元数据中的key 不能包含中文字符;value可以包含中文(中文与时间格式都需要进行转码)
metadata.addUserMetadata(fileName,urlencode("中文文件名"))
metadata.addUserMetadata(createTime,urlencode(datetime))
Content-Length
对象消息体长度,一般用来在上传前定义为file.length,用来做传输过程中的完整性校验。
有些版本sdk中,如果没有添加Content-Length,会出现告警
No content length special for stream data. Stream contents will be buffered in memory and could result in out of memory errors
告警本身不影响上传,是提示流内容会缓存在内存中,可能会导致内存不足的情况出现。
InputStream in = new FileInputStream(s3file);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(s3file.length());
Content-Type
对象实体类型,在对象存储中,很多时候会用到预签名url或者publicacl对象的访问链接,该元数据会影响浏览器行为。浏览器会根据该值来判断以何种形式处理目标文件,如果指定对象元数据中的content-type与对象本身的媒体类型一致,则浏览器会以直接预览形式处理(需要浏览器支持这种格式,部分媒体类型可能需要插件支持 ),如果不指定,默认以文件流形式处理(直接下载)。
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(contentType);
PutObjectRequest putRequest = new PutObjectRequest(bucketName, fileObjKeyName, file);
putRequest.setMetadata(metadata);
一般流式格式为"application/octet-stream",对应url浏览器会直接执行下载。
常用媒体类型需要直接在线预览对应如下格式:
.txt文本 | contentType=“text/plain” |
---|---|
.jpg图片 | contentType=“image/jpeg” |
.mp3音频 | contentType=“audio/mp3” |
.mp4视频 | contentType=“video/mp4” |
其余类型可以网上查询,使用s3browser windows上传时,会自动将content-type更改为合适的媒体类型。
Last-Modified
最后更新时间,对象存储中,该值一般为对象落到存储中的时间,即为上传时间,如果发生过追加写,则为最后一次追加写的时间。一般用来校验对象是否被后续更新过
x-amz-version-id
对象version-id,开启多版本时,当重复上传同key对象时,老的对象不会被覆盖,而是移除current标识,每个老对象都有一个对应的version-id。
当执行默认简单接口时(putobject,deleteobject,getobject)等不带version后缀的接口方法时,访问的对象为current对象,即当前对象,而使用如(getobjectversion)等接口时,可以在接口中添加一个参数version,getobject(objectkey,bucketname,versionid),从而来访问历史版本对象。当多版本误删文件时,也可以使用copyobject接口来将历史某个version对象copy为当前版本进行恢复,从而实现类似防误删的功能。
ETag
资源标识符,在对象存储中
-
如果是整体上传,该对象Etag即为对象的md5值,而分段上传时,计算方法略有不同
-
分段上传时,Etag计算方法不同
1、计算每个分段的md5 digest
2、拼接每个分段的md5 digest
3、将拼接好的md5 digest计算md5,得到其md5的十六进制的字符串即为分段对象的Etag
Content-Md5
Md5校验值,可以用来设置此值来进行传输校验,如果设置了该值,当服务器接收到对象的该值与用户设置的一致时,才会上传成功。
注意Conent-Md5并非对象的直接md5值,而是需要bash64转码计算后的值。
content_md5 = hashlib.md5()
content_md5.update(s3file)
content_bash64 = base64.b64encode(content_md5.digest())
return content_base64.decode("utf-8")
注:Content-Length、Etag、Content-Md5是常用的用来做传输校验和确认的元数据。过多校验可能会导致增加上传时耗,可根据需求自行选用。