目前個人工做主要使用的仍是Java。因此,我決定使用UpYun官方提供的Java版的SDK體驗下UpYun。java
當使用IDE打開源碼來看時,我發現這個SDK,有不少問題:git
沒有構建,因此很難自動化測試github
全部的方法,功能都寫在一個com.UpYun類裏,雖然這些類只有1000多行,但當你看到文件加密,判斷文本是否爲空,上傳文件等不一樣職責的東西混在一塊兒,你的感受如何?編程
測試文件和src
源碼包是在同一級目錄裏併發
├── README.md ├── sample.jpeg ├── src │ ├── com │ │ └── UpYun.java │ └── demo │ ├── FileBucketDemo.java │ └── PicBucketDemo.java └── test.txt
使用這個SDK時,你仍是必須去官方去查API,由於SDK中的一些方法接受的參數是Map。如下是原來上傳圖片及作縮略圖的代碼demo:maven
// 設置縮略圖的參數 Map<String, String> params = new HashMap<String, String>(); // 設置縮略圖類型,必須搭配縮略圖參數值(KEY_VALUE)使用,不然無效 params.put(PARAMS.KEY_X_GMKERL_TYPE.getValue(), PARAMS.VALUE_FIX_BOTH.getValue()); // 設置縮略圖參數值,必須搭配縮略圖類型(KEY_TYPE)使用,不然無效 params.put(PARAMS.KEY_X_GMKERL_VALUE.getValue(), "150x150"); // 設置縮略圖的質量,默認 95 params.put(PARAMS.KEY_X_GMKERL_QUALITY.getValue(), "95"); // 設置縮略圖的銳化,默認銳化(true) params.put(PARAMS.KEY_X_GMKERL_UNSHARP.getValue(), "true"); // 若在 upyun 後臺配置過縮略圖版本號,則能夠設置縮略圖的版本名稱 // 注意:只有存在縮略圖版本名稱,纔會按照配置參數製做縮略圖,不然無效 params.put(PARAMS.KEY_X_GMKERL_THUMBNAIL.getValue(), "small"); // 上傳文件,並自動建立父級目錄(最多10級) boolean result = upyun.writeFile(filePath, file, true, params);
單看這句: params.put(PARAMS.KEY_X_GMKERL_VALUE.getValue(), "150x150");
,你不去官網去查,鬼知道"150x150"
是什麼意思。並且,很容易寫錯不是嗎?學習
沒有異常處理,當發生錯誤時,好比響應返回403時,原做者只返回一個boolean來表現成功與否,而沒有使用者到底錯在哪。測試
API的設計很差。如上傳文件的API爲writeFile
,使用uploadFile
彷佛更好一些。並且幾個方法參數中使用了boolean類型,你知道upyun.uploadFile(filePath, file4, true);
中的true
表明什麼嗎?ui
我剛開始試圖在原來的代碼的基礎上重構,可是重構到後面,我發現,我沒法重構下去。只能選擇重寫。加密
剛開始時,我選擇在原有的基礎上重構,方法:
看過《重構》的都就必定理解,我爲何要這麼作了。小步是由於若是重構錯了,能夠很輕鬆的返回,測試是爲了保證你的重構是正確的。
可是,重構到後面,我仍是決定重寫了。我不保證個人寫法是最好的。只求共同窗習,有哪裏很差的,多謝指出。
如下是我實現的上傳圖片並作縮略圖的代碼示例:
PictureItem pictureItem = upYunClient.recursionMkDir() .picThumbnail(ThumbnailType.VALUE_FIX_BOTH, 150, 150) .picThumbnailQuality(95) .picThumbnailSharpen() .picThumbnailName("small").uploadPicture(filePath, file); assert pictureItem.getHeight() == 150; assert pictureItem.getWidth() == 150;
使用鏈式編程,舒服一些;把一些代碼使用者不須要關心的東西封裝起來。
最終項目結構:
├── pom.xml ├── README.md ├── src │ ├── main │ │ └── java │ │ └── com │ │ └── upyun │ │ ├── Crypto.java │ │ ├── FileItem.java │ │ ├── _.java │ │ ├── PictureItem.java │ │ ├── PictureRotateAngle.java │ │ ├── ThumbnailType.java │ │ ├── UpYunAuthenticateException.java │ │ ├── UpYunBaseException.java │ │ ├── UpYunClient.java │ │ ├── UpYunIOException.java │ │ ├── UpYunNotFoundException.java │ │ └── UpYunServerErrorException.java │ └── test │ ├── java │ │ └── demo │ │ ├── FileBucketDemo.java │ │ ├── FileBucketTest.java │ │ ├── PicBucketDemo.java │ │ ├── PicBucketTest.java │ │ └── UpYunClientBuilderTest.java │ └── resources │ ├── sample.jpeg │ └── test.txt
事實上,在這裏,我尚未考慮併發的狀況,由於目前,我在這方面還不是很擅長。但願有朋友指出問題。
PS:代碼已經new pull request。github:https://github.com/zacker330/upyun-java-sdk