发表于: 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
评论