SDK 常见问题

PHP SDK 常见问题

Q01:上传文件时报 cURL error: Resolving timed out  ?

FAILED RequestCoreException: cURL resource: Resource id #269; cURL error: Resolving timed out after 10519 milliseconds (28)

A:

此异常一般是客户端和对象存储网络不通导致的,用户可以 ping 对象存储的域名(外网 nos-eastchina1.126.net,内网 nos-eastchina1-i.netease.com),查看网络是否是通的。

JAVA SDK使用常见问题

Q01: Java NosClient 是线程安全的吗?

A:

比如多个用户上传文件,在不同的线程里,我可不可以用同一个 client

是线程安全的,可以用同一个 client。

A:

我们设置的时候是设置1小时超时的,结果我生成链接后没过5分钟就失效了 http://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。

Q03:Java 在PC上多线程并发上传一个大文件时为什么本地 PC 的 cpu 达到100%

客户端会计算文件块的摘要,并跟服务器返回的摘要(ETag)进行比对,确认数据传输 完整性。计算摘要过程会耗费一定 的 cpu cycle,放服务器上跑会好很多。

Q04:我上传的文件是图片,但是web上访问的话会弹出下载框,我希望是web上直接显示图片

A:

浏览器等是通过返回对象的 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);

Q05:上传时不知道文件大小怎么办

A:有些业务场景在上传 NOS 对象时,可能不知道文件实际长度,比如流式上传,但 HTTP 的 PUT 是需要使用 Cotent-Length 头指定 Body 的长度的,通常做法如果是直接 HTTP 编程,设 计一个客户端缓冲区,比如 8MB,若文件小于缓冲区,直接一次 PUT 操作;若文件较大, 则使用分块上传接口(详见 API 手册、SDK 使用文档)。

Q06:为什么上传接口( Put Object )有100MB的限制

A:文件比较大时,单次 http 请求很有可能会失败,而且无法断点续传,大的分块对服务器 临时缓冲区也不友好,同时也不利于持久层的存储。基于上述原因,使用 PutObject 接口 最大不允许上传超过 100MB 的对象,建议使用 MultiUpload 接口。如果不想关心这些底层 细节,JAVA SDK 建议使用 TransferManager.upload(PutObjectRequest) 接口,这是一个 high level 的接口封装,根据数据特征(File or InputStream)自动调用合适的 nos api。

认证失败是怎么回事

A:

  • 错误码为 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 。