文档章节

UpYun体验之Java SDK

翟志军
 翟志军
发布于 2014/04/04 08:34
字数 918
阅读 772
收藏 8

申明:本文只希望做技术探讨,无其它意思。

目前我的工作主要使用的还是Java。所以,我决定使用UpYun官方提供的Java版的SDK体验下UpYun。

原SDK存在问题

当使用IDE打开源码来看时,我发现这个SDK,有很多问题:

  1. 没有构建,所以很难自动化测试

  2. 所有的方法,功能都写在一个com.UpYun类里,虽然这些类只有1000多行,但当你看到文件加密,判断文本是否为空,上传文件等不同职责的东西混在一起,你的感觉如何?

  3. 测试文件和src源码包是在同一级目录里

     ├── README.md
     ├── sample.jpeg
     ├── src
     │   ├── com
     │   │   └── UpYun.java
     │   └── demo
     │       ├── FileBucketDemo.java
     │       └── PicBucketDemo.java
     └── test.txt
    
  4. 使用这个SDK时,你还是必须去官方去查API,因为SDK中的一些方法接受的参数是Map。以下是原来上传图片及做缩略图的代码demo:

       		// 设置缩略图的参数
     		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"是什么意思。而且,很容易写错不是吗?

  5. 没有异常处理,当发生错误时,比如响应返回403时,原作者只返回一个boolean来表现成功与否,而没有使用者到底错在哪。

  6. API的设计不好。如上传文件的API为writeFile,使用uploadFile似乎更好一些。而且几个方法参数中使用了boolean类型,你知道upyun.uploadFile(filePath, file4, true);中的true代表什么吗?

我刚开始试图在原来的代码的基础上重构,但是重构到后面,我发现,我无法重构下去。只能选择重写。

说说我的重构过程

刚开始时,我选择在原有的基础上重构,方法:

  1. 使用maven构建
  2. while(100%满意) 一小步重构,一测试

看过《重构》的都就一定理解,我为什么要这么做了。小步是因为如果重构错了,可以很轻松的返回,测试是为了保证你的重构是正确的。

但是,重构到后面,我还是决定重写了。我不保证我的写法是最好的。只求共同学习,有哪里不好的,多谢指出。

以下是我实现的上传图片并做缩略图的代码示例:

	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

© 著作权归作者所有

共有 人打赏支持
翟志军

翟志军

粉丝 348
博文 76
码字总数 79851
作品 2
深圳
程序员
私信 提问
加载中

评论(5)

s
shylock
之前使用过 却看的吐血
翟志军
翟志军

引用来自“lgscofield”的评论

比起AWS有啥优势吗

我目前还没有使用过AWS

lgscofield
lgscofield
比起AWS有啥优势吗
筱龙缘
筱龙缘
mark
NetBeans 时事通讯(刊号 # 147 - May 18, 2011)

Community Java 杂志——寻找女性技术贡献者 你知道有女性在为技术而工作,或着你就是其中的一员?甲骨文正在发起一项新的在线 Java 杂志,并为找到的女性贡献着开辟了“Java Nation”专栏。...

晨曦之光
2012/03/09
0
0
win8下Android SDK环境变量安装

一: 下载 Android SDK http://developer.android.com/sdk/index.html 这里有两种,一种是下载“ADT Bundle for Windows” ,这是个已经集成好的Eclipse开发环境,已经配置好所有的东西,只需...

EDIAGD
2013/07/08
0
1
用 JNI 进行 Java 编程(1)

本教程是关于什么的? Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java Software Development Kit (SDK))的一部分。JNI 允许 Java 代码使...

Jerikc
2012/10/08
0
0
新的Eclipse插件CTP减轻Java开发人员进行Windows Azure开发时的负担

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客。 在昨天的EclipseCon 2011大会上,Vijay Rajagopalan在他的演...

晨曦之光
2012/03/09
0
0
微信开发 Java SDK - Weixin Java Tools

微信开发 Java 开发工具包(SDK),支持包括微信支付、微信开放平台、小程序、企业号/企业微信、公众号(包括服务号和订阅号)等的后端开发。 本开发工具包基于chanjarster的同名SDK,增加了...

班纳睿
2016/12/22
0
95

没有更多内容

加载失败,请刷新页面

加载更多

手写tomcat+servlet

写程序一定要有思路,思路很重要! 一、我们分两步第一步先实现手写tomcat,第二部写servlet 所用技术: 1、soket通信 IO流 2、http请求与相应 3、解析xml 4、java反射技术 导入所需要的jar...

jason_kiss
27分钟前
1
0
Beetl模板的基础用法 【变量、循环、条件】---《Beetl视频课程》(2)

本期视频做了一个博客的首页列表; 内容简介:springboot 集成 beetlsql;使用for循环,使用if控制语句,使用虚拟属性,定义变量等等 一起学beetl目录:https://my.oschina.net/u/1590490?ta...

Gavin-King
33分钟前
1
0
各种视频监控上墙方案的比较

方案1、一使用 DVR 、NVR 直接显示上墙 不得不说,这种办法是成本最低廉的,但这里有不少限制: 无法实现分散点的集中上墙。譬如连锁经营的酒店,如果我在总部建立一个集中上墙的环境,这个就...

PeakFang-BOK
56分钟前
4
0
netfilter 和 iptables

一. netfilter 1. 什么是entfilter 和 iptables netfilter指整个项目名 在这个项目里面,netfilter特指内核中的netfilter框架, iptables指用户空间的配置工具。 netfilter在协议栈中添加了5...

Fc丶
今天
2
0
搞定了微信小程序富文本渲染解决方案-后端渲染方案Html2Wxml2J

先介绍一下最近遇到的问题: 最近小程序项目中有文章详情页需要渲染富文本,微信小程序官方提供的<rich-text>是个弱鸡,很多标签不支持,用起来也麻烦,性能也不咋地。 吐槽完了,我们决定寻...

山东-小木
今天
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部