对象存储常见问题
NOS 基本使用问题
上传对象成功后,如何访问对象(NOS 生成的 HTTP URL 是怎么样的)
可以通过 HTTP 访问对象的 URL ,NOS 的 URL 生成规则[$protocol://$bucket_name.$endpoint/$object_name]
$protocol:HTTP 或者 HTTPS
$bucket_name:桶名
$object_name:对象名
$endpoint: 对应分区域名(比如 杭州分区外网:nos-eastchina1.126.net;杭州分区内网:nos-eastchina1-i.netease.com)
NOS 能指定下载时的文件名么
请使用download参数,例如:https://doc.nos-eastchina1.126.net/Koala.jpg?download=x.jpg,将弹出下载框,另存为x.jpg
NOS 的公开桶和私有桶有什么区别(NOS 如何保证 HTTP URL 访问方式的安全性)
公开桶和私有桶最大的区别是私有桶读对象的时候需要在请求中包含认证签名,公开桶 读不需要。私有桶和公开桶上传对象都需要认证。
我上传的文件是图片,但是web上访问的话会弹出下载框,我希望是web上直接显示图片
浏览器等是通过返回对象的 Content-Type 字段进行资源类型判断和展示的,所以为了使得 web 浏览器能够在页面上显示,上传对象的时候需要设置 Content-Type ,详见 API 与 SDK 使用说明。 JAVA SDK 的使用方式如下:
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(TestHelper.localTestFilePath+fileName)); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentType(contentType); putObjectRequest.setMetadata(metadata); client.putObject(putObjectRequest);
上传时不知道文件大小怎么办
有些业务场景在上传 NOS 对象时,可能不知道文件实际长度,比如流式上传,但 HTTP 的 PUT 是需要使用 Cotent-Length 头指定 Body 的长度的,通常做法如果是直接 HTTP 编程,设 计一个客户端缓冲区,比如 8MB,若文件小于缓冲区,直接一次 PUT 操作;若文件较大, 则使用分块上传接口(详见 API 手册、SDK 使用文档)
为什么上传接口( Put Object )有100MB的限制
文件比较大时,单次 http 请求很有可能会失败,而且无法断点续传,大的分块对服务器 临时缓冲区也不友好,同时也不利于持久层的存储。基于上述原因,使用 PutObject 接口 最大不允许上传超过 100MB 的对象,建议使用 MultiUpload 接口。如果不想关心这些底层 细节,JAVA SDK 建议使用 TransferManager.upload(PutObjectRequest) 接口,这是一个 high level 的接口封装,根据数据特征(File or InputStream)自动调用合适的 nos api.
NOS 访问失败与错误
认证失败是怎么回事
- 错误码为 SignatureDoesNotMatch:检查计算签名的协议是否正确,参考本文档访问控
制章节如果是使用 SDK,计算签名的算法是封装过的,那么需要检查访问凭证密钥 (SecretKey)的正确性
- 错误码为 InvalidAccessKeyId:认证服务器返回访问凭证非法,有可能是格式非法,
或是NoSuchUser
- 错误码为 AccessDenied
缺少认证相关信息,且目标资源非 public-read 认证服务器异常 外链时expire参数过期 桶的owner匹配失败,尝试访问别人的私有资源
- JAVA SDK GetObject 时 sdk 报解析时间戳出错
nos-sdk-1.1.7 依赖的时间解析包是 joda-time-2.1,如果项目中用了较老版本, 比如1.6,则会报上述错误(异常类似 com.netease.cloud.ClientException: Unable to unmarshall response (Invalid format: "Tue, 05 Mar 2013 15:50:46 Asia/Shanghai" is malformed at "Asia/Shanghai"))
- GetBucket 发现桶中无对象,但删桶失败,报桶非空::
当桶内有对象、有历史版本,或者有未完成的分块上传信息( UploadInfo ),都无法删桶。 请调用相应的接口清理这些内容后,再删除桶。
- MSG:Date 头指定的时间非法,该时间跟服务器收到请求的时间相差不能超过15分钟
NOS 请求头中带有 Date 时间戳,如果这个时间戳与 NOS 服务器的时间差值在正负15分钟 以上,NOS 服务器则拒绝该服务,会返回 403 Forbidden,避免请求被恶意者截取后对 NOS 进行重放攻击。
- 返回 Date 格式不合法是什么原因::
NOS 的请求要求采用符合 RFC1123 的日期格式,因此请确认日志格式符合要求。 如果使用 Java-Sdk 出现此问题,请确认未设置 \-Duser.timezone=GMT+8 。
SDK使用常见问题
Java NosClient 是线程安全的吗?比如多个用户上传文件,在不同的线程里,我可不可以用同一个 client
是线程安全的,可以用同一个 client。
Java SDK 调用 generatePresignedUrl 生成私有 link 的问题
我们设置的时候是设置1小时超时的,结果我生成链接后没过5分钟就失效了 https://nos.netease.com/xxxx/xxxx?NOSAccessKeyId=xxxx&Expires=1411094624&Signature=rO5Cihe3h0qXVDwEo4es23wrEU6d1ksy3yVR1i9m9cM%3D&download=%E8%AE%A4%E8%AF %81%E4%BC%98%E7%A7%80%E8%AF%81%E4%B9%A6.zip]
答案 generatePresignedUrl 函数的参数是 毫秒,所以,要乘以1000
Java 在PC上多线程并发上传一个大文件时为什么本地 PC 的 cpu 达到100%
客户端会计算文件块的摘要,并跟服务器返回的摘要(ETag)进行比对,确认数据传输 完整性。计算摘要过程会耗费一定 的 cpu cycle,放服务器上跑会好很多
最后更新:2017-01-03 10:48:51