发表于: 2017-11-29 22:44:08
1 618
今日完成的事情:
今日完成任务七的最后两个模块,数据从七牛云迁移到阿里云,从阿里云迁移到七牛云。
刚开始看接口文档的时候发现,两家都提供了可以迁移的工具:
上面是七牛云的,阿里也有。然后就想着用工具进行迁移,但是师兄告诉我,不能用这个方法,要用Java代码事先。
然后看了一下接口文档,发现,两家都提供了下载和上传的工具,就先想出了一个思路:
从阿里云把文件下载到本地,然后从本地把文件上传到七牛云,完成数据迁移。
但是师兄听了我的方案之后,直接否决了。理由很简单,要是程序部署到服务器,而且文件数量比较大,这种方法是行不通的。
然后在阿里云的接口文档中发现了这个:
上传网络流,刚开始看到的时候,不是很理解,然后百度了一波,和师兄讨论了一下。发现我昨天不知道是干什么用的外链在这里可以转换为流。而且网络上的资源都可以以流的形式进行上传和下载。而存储的时候只需要存储外链就可以了,今天终于是理解了。
然后有了思路就好办了。
首先是七牛云获取在七牛存储的所有文件的文件名称:
//获取文件信息
public List<String> getFile() {
List<String> keys=new ArrayList<String>();
Zone z = Zone.autoZone();
Configuration c = new Configuration(z);
BucketManager bucketManager = new BucketManager(authCreate(), c);
//文件名前缀
String prefix = "";
//每次迭代的长度限制,最大1000,推荐值 1000
int limit = 1000;
//指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
String delimiter = "";
//列举空间文件列表
BucketManager.FileListIterator fileListIterator =
bucketManager.createFileListIterator(bucketname, prefix, limit, delimiter);
while (fileListIterator.hasNext()) {
//处理获取的file list结果
FileInfo[] items = fileListIterator.next();
for (FileInfo item : items) {
keys.add(item.key);
}
}
return keys;
}
然后把名称存在一个list里面,return回去。
然后是七牛下载,七牛下载下来直接就是外链:
public String download(String fileName) throws UnsupportedEncodingException {
String domainOfBucket = "http://ozuqudaqr.bkt.clouddn.com/";
String encodedFileName = URLEncoder.encode(fileName, "utf-8");
String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
//构造私有空间的需要生成的下载的链接
// String URL = "http://ozuqudaqr.bkt.clouddn.com/c04-03.jpg";
//调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间
String downloadRUL = authCreate().privateDownloadUrl(publicUrl, 3600);
return downloadRUL;
}
这个下载是提供文件名称,就可以下载外链,把上面获取的所有文件名称直接传到这个方法,就可以拿到所有文件按的外链。然后把外链提过给阿里上传:
public void uploadStream(String urlStr,String key) throws IOException {
DownLoadFromUrl downLoadFromUrl=new DownLoadFromUrl();
InputStream inputStream=downLoadFromUrl.streamForUrl(urlStr);
initOssClient().putObject("task0",key, inputStream);
initOssClient().shutdown();
}
urlStr是外链名称,key是存储到阿里云的文件名称,最后七牛上传到阿里的接口:
//七牛迁移到阿里
@RequestMapping(value = "/qiniutoali",method = RequestMethod.GET)
@ResponseBody
public String aliToqiniu() throws IOException {
List<String> keys=qiniuDemo.getFile();
for(String key:keys){
String url=qiniuDemo.download(key);
aliDemo.uploadStream(url,key);
}
return "success";
}
然后反过来是阿里云下载上传到七牛云,在这里阿里是直接下载文件,阿里的下载外链是自己拼接的url,其实都是一个道理,上代码,首先获取阿里云存储的所有文件名称:
public List<String> getFile(){
List<String> keys=new ArrayList<String>();
// 列举Object
ObjectListing objectListing = initOssClient().listObjects(bucketName, "");
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary s : sums) {
keys.add(s.getKey());
}
// 关闭client
initOssClient().shutdown();
return keys;
}
然后根据这些文件名称拼接可供下载的外链:
public URL getUrl(String key){
String bucketName = "task0";
// 设置URL过期时间为1小时
Date expiration = new Date(new Date().getTime() + 3600 * 1000);
// 生成URL
URL url = initOssClient().generatePresignedUrl(bucketName, key, expiration);
return url;
}
传入文件名,拼接url,然后再把url返回,七牛云根据这些外链,进行上传:
//stream的方式上传到空间
public void uploadStream(String remoteSrcUrl,String key){
Zone z = Zone.autoZone();
Configuration c = new Configuration(z);
BucketManager bucketManager = new BucketManager(authCreate(), c);
//抓取网络资源到空间
try {
FetchRet fetchRet = bucketManager.fetch(remoteSrcUrl, bucketname, key);
} catch (QiniuException ex) {
System.err.println(ex.response.toString());
}
}
remoteStrUrl是外链,key是存储到七牛云的文件名称,最后阿里云迁移到七牛云的接口:
//阿里迁移到七牛
@RequestMapping(value = "/alitoqiniu",method = RequestMethod.GET)
@ResponseBody
public String qiniuToali(){
List<String> keys=aliDemo.getFile();
for(String key:keys){
URL url=aliDemo.getUrl(key);
qiniuDemo.uploadStream(url.toString(),key);
}
return "success";
}
两个接口完成,然后跟着韦杰师兄学习了一波代码的规范:
if里面最多三个嵌套,接口只返回给前台json数据,和一些状态信息。
然后还学习了一波动态sql(以前这部分内容没有学习,今天补回来):
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
这些是官方文档里面的话,然后是自己的xml文件更改成下面:
<update id="updateUser" parameterType="com.mmy.model.User">
update users
<set>
<if test="name != null">name=#{name},</if>
<if test="passWord != null">pass_word=#{passWord},</if>
<if test="salt != null">salt=#{salt},</if>
<if test="phone != null">phone=#{phone},</if>
<if test="mail != null">mail=#{mail},</if>
<if test="head != null">head=#{head},</if>
<if test="createUser != null">create_user=#{createUser},</if>
<if test="updateUser != null">update_user=#{updateUser},</if>
</set>
where phone LIKE #{phone}
</update>
举个例子,当我更改密码的时候,我只更改了密码,其他的都没有动,这个时候mybatis动态生成的语句就是:
update users pass_word = #{passWord} where phone LIKE #{phone}
动态的把pass_word = #{passWord}后面的“,”给去掉了。
原理就相当于 :
<trim prefix="SET" suffixOverrides=","> ...</trim>
去除<set></set>包围里面生效的语句,紧邻where语句的“,”。
明日计划的事情:
明天完善一下代码,开始进行任务八。
遇到的问题:
今天学习的内容,都在第三方接口文档里面,耐心看都可以找到对应的方法,没有困难。
收获:
动态sql,以及第三方接口的使用。
任务开始时间:2017/11/23
预计完成时间:2017/12/1
延期:无
禅道:http://task.ptteng.com/zentao/my-task.html
评论