閱讀982 返回首頁    go 網易 go 網易蜂巢


對象存儲常見問題

目錄

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

  上一篇:go 集群常見問題
  下一篇:go 創建雲硬盤