上週寫了一個項目,用到了圖片上傳和存儲,使用的是又拍雲的雲存儲,本文記錄一下接入的流程和一些注意事項。
接入
又拍雲 Java SDK:https://github.com/upyun/java-sdk
pom 文件中引入依賴:
<dependency>
<groupId>com.upyun</groupId>
<artifactId>java-sdk</artifactId>
<version>4.2.0</version>
</dependency>
使用
初始化 RestManager
RestManager manager = new RestManager("空間名稱", "操作員名稱", "操作員密碼");
其中,空間名稱即爲雲存儲的「服務名稱」。
上傳文件
public Response writeFile(String filePath, byte[] data, Map<String, String> params)
public Response writeFile(String filePath, File file, Map<String, String> params)
public Response writeFile(String filePath, InputStream inputStream, Map<String, String> params)
- filePath 是保存到又拍雲存儲的文件路徑,以
/
開始。 - 第二個參數 接受 InputStream 、 File 和 byte[] 三種類型的數據。
- params 上傳額外可選參數,詳見 api 文檔。
返回結果
Response response = manager.writeFile(filePath, file, params);
如果 response.isSuccessful() 爲 true,則表示上傳成功,通過又拍雲綁定的域名 + 定義文件的路徑 即可訪問文件。例如我的 filePath 是 /test/1.jpg
,又拍雲綁定的域名是 https://cdn.juemuren4449.com
,那麼文件的鏈接即爲 https://cdn.juemuren4449.com/test/1.jpg
。
關於更多上傳和其他操作可以參考:
java-sdk README.MD。
遇到的問題
如果上傳有錯誤,可以通過查看 response.code() 對照下面的錯誤碼錶進行問題排查。
API 錯誤碼錶:http://docs.upyun.com/api/errno/#api
filePath 問題
第一次上傳的時候,我的 filePath 只寫了目錄名 /test
,運行之後報錯爲 406。然後我才明白,這個 filePath 其實說白了就是把文件放到又拍雲的目錄加文件名,例如 /test/1.jpg
,就是 test 目錄下的 1.jpg 文件,文件路徑的後綴要和文件的後綴一致。
編碼問題
我傳輸的文件是圖片,且不會重複,所以我直接把 file.getName() 作爲文件名,測試的時候一切正常,但是程序在 Windows 下會提示 path encoding should be utf8
,錯誤碼是 40000030。
最後通過 URLEncoder.encode(file.getName(), "UTF-8"))
解決了問題,如果文件名有特殊字符,也推薦先進行 encode。當然,也可以自定義文件名。
文件覆蓋問題
若空間內指定目錄已存在相同文件,則會被覆蓋,且不可逆。
上傳的時候要特別注意,官方推薦可以通過獲取文件信息來判斷是否已存在相同文件,我個人認爲如果對文件名沒有要求,可以使用 UUID 或者 MD5 作爲文件名,也可以避免文件名重複。
更多各語言版本的 SDK 請查看:「存儲 & 處理 SDK」。
相關閱讀:
歡迎訪問的個人博客:掘墓人的小鏟子