目前个人工做主要使用的仍是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