发表于: 2017-10-24 23:01:44

1 741


今天完成的事情:

1.使用数据流上传、下载文件

昨天的方法是使用本地上传的方式,然而这样显然是不行的,于是乎重构为上传、下载都使用数据流

阿里云部分:

上传传入参数为文件数据流、文件名(包括后缀名)

public static void upLoad(InputStream inputStream, String fileName) {
   try {
       String endpoint = "oss-cn-shenzhen.aliyuncs.com";
       OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
   /*InputStream inputStream = new FileInputStream(filePath);*/
       ossClient.putObject(bucketName, fileName, inputStream/*new File(filePath)*/);
       inputStream.close();
       ossClient.shutdown();
   } catch (OSSException oe) {
       log.error("Caught an upLoad OSSException," + "the error code is " + oe.getErrorCode() + "," + "reason is " + oe.getMessage());
   }catch (IOException e) {
       log.error("File upload problem,throw a IOException");
   }
}

下载返回所下载文件的数据流

public static InputStream downLoad(String fileName){
   try {
       String endpoint = "oss-cn-shenzhen.aliyuncs.com";
       OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
       /*BufferedInputStream stream = new BufferedInputStream();*/
       OSSObject ossObject = ossClient.getObject(bucketName, fileName);
       return ossObject.getObjectContent();
   } catch (OSSException oe) {
       log.error("Caught an downLoad OSSException," + "the error code is " + oe.getErrorCode() + "," + "reason is " + oe.getMessage());
   }
   return null;
}


上传的测试结果就不放了,放个下载的

上传到阿里云对象储存

测试类:

@Test
public void upLoad1() throws Exception {
   InputStream is = ALiYunUtil.downLoad("test2.png");
   FileOutputStream fos = new FileOutputStream("E:\\svn\\test3.png");
   byte[] b = new byte[1024];
   int len = 0;
   while((len = is.read(b)) != -1)
   {
     fos.write(b,0,len);
   }
   is.close();
   fos.close();
}


测试结果:(现在才发现下载测试写在upload测试方法中了……)


效果展示:


七牛云部分:

上传也改成了数据流

 public static void upLoad(InputStream inputStream, String fileName) {
       Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
       String token = auth.uploadToken(bucketName);
       boolean isException = false;
       Zone z = Zone.autoZone();
       Configuration c = new Configuration(z);
       UploadManager uploadManager = new UploadManager(c);
       try {
/*            InputStream inputStream = new FileInputStream(filePath);*/
           Response res = uploadManager.put(inputStream, fileName, token, null, null);
       } catch (QiniuException e) {
           Response r = e.response;
           isException = true;
           logger.error(r.toString());
           try {
               logger.error(r.bodyString());
           } catch (QiniuException el) {
           }
       } finally {
           if (!isException) {
               logger.info("Uploaded successfully");
           }
       }
   }


下载返回数据流,未写判断文件是否存在,后面补上,有点坑,其实就是返回一个下载地址给你,七牛云开发人员真懒啊

public static InputStream downLoad(String fileName) throws IOException {
   /*String fileName = "七牛/云存储/qiniu.jpg";*/
   String domainOfBucket = "http://img.summerwaves.cn";
   String encodedFileName = URLEncoder.encode(fileName, "utf-8");
   String finalUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
   System.out.println(finalUrl);
   return new URL(finalUrl).openStream();
}

测试结果就不放了,和阿里云一样


2.获取对象储存中所有文件的名字

两个对象储存获取文件列表的方法完全不同,搞得我昏了头

阿里云部分:

public static List<String> getAllFileName() {
   try {
       List<String> keys = new ArrayList<>();
       OSSClient ossClient = new OSSClient("oss-cn-shenzhen.aliyuncs.com", accessKeyId, accessKeySecret);
       String nextMarker = null;
       final int maxKeys = 2;
       // 列举Object
       ObjectListing objectListing;
       do {
        objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).
                   withMarker(nextMarker).withMaxKeys(maxKeys));
           List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
           for (OSSObjectSummary s : sums) {
               keys.add(s.getKey());
           }
          nextMarker = objectListing.getNextMarker();
       } while (objectListing.isTruncated());

       ossClient.shutdown();
       return keys;
   }catch (OSSException oe) {
       log.error("Caught an getAllFileName OSSException," + "the error code is " + oe.getErrorCode() + "," + "reason is " + oe.getMessage());
   }
   return null;
}

注意到上面的“maxkeys”也就是列出文件的最大数量我只写了2,因为阿里云只允许最大遍历1000个文件,而官方文档里又没写怎么一次性获取全部文件,只好研究下官方SDK啦,上面就是最终可以遍历空间中所有文件名字的代码,别说写1000,就是写1也可以全部遍历(当然是要按文件的多少来决定maxkeys)


测试代码:

public void getAllFileName() throws Exception {
   List<String> keys = ALiYunUtil.getAllFileName();
   for (String key : keys) {
       System.out.println(key);
   }
}


对象储存中文件:

测试结果:

测试成功,获取全部文件的文件名


七牛云:

同样没抓异常,没打日志

public static List<String> getAllFileName() {
       List<String> keys = new ArrayList<>();
       Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
       Configuration cfg = new Configuration(Zone.zone0());
       BucketManager bucketManager = new BucketManager(auth, cfg);
       //文件名前缀
       String prefix = "";
       //每次迭代的长度限制,最大1000,推荐值 1000
       int limit = 2;
       //指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
       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);
//                System.out.println(item.key);
//                System.out.println(item.hash);
//                System.out.println(item.fsize);
//                System.out.println(item.mimeType);
//                System.out.println(item.putTime);
//                System.out.println(item.endUser);
           }
       }
       return keys;
   }

七牛云还好,虽然也限制了一次只遍历1000,但是会自动接力遍历,不用自己设置


测试代码:

public void getAllFileName() throws Exception {
   List<String> keys = QiNiuUtil.getAllFileName();
   for (String key : keys) {
      System.out.println(key);
   }
}


对象储存中文件:

测试结果:



明天计划的事情:

代码迁移大体完成,明天只要花一点时间结合上传、下载、获取全部文件名字就可以完成代码文件迁移了

然后开始编写demo的代码


遇到的问题:

1.文件怎么转换成数据流,数据流怎么写入文件

百度解决的,上面代码都写着了

2.阿里云没有一次性获得全部文件的方法,官网的上的用法也很简单

解决方法:到阿里云提供的github上看着代码一点一点尝试解决的,就不能写一个一次性遍历所有文件的方法在上面吗!

3.使用配置文件切换对象储存没什么思路,不过我先把两个对象储存封装工具的方法都写成一样的做了准备,后面再想想办法吧


收获:

1.学会了文件和文件流的互相转换

2.数据迁移部分大体完成


进度:

任务7开始时间:2017.10.18

预计demo时间:2017.10.26

延期风险:有

理由:今天没遇到什么困难的问题,明天后天也顺利的话可以交任务吧,前提是顺利的话

禅道

http://task.ptteng.com/zentao/project-task-350.html




返回列表 返回列表
评论

    分享到