============ **常见问题** ============ 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分钟就失效了 http://nos.netease.com/xxxx/xxxx?NOSAccessKeyId=xxxx&Expires=1411094624&Sign ature=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,放服务器上跑会好很多