Skip to content
This repository was archived by the owner on Mar 6, 2024. It is now read-only.

Commit 5c0623b

Browse files
committed
1.修复已知BUG
2.添加文件刷新 3.添加日志下载
1 parent 21853e9 commit 5c0623b

File tree

11 files changed

+231
-36
lines changed

11 files changed

+231
-36
lines changed

README.md

Lines changed: 92 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,109 @@
11
# 七牛云——对象存储管理工具介绍
22

3-
**由于我是一个七牛的重度使用者(主要是对象存储),每次上传文件、复制链接、下载文件都必须用浏览器打开网页,而且还要登录,感觉好麻烦啊,干脆就自己开发了一个这样的工具(使用JavaFX编写),打包成jar包**
3+
**由于我是一个七牛的重度使用者(主要是对象存储),每次上传文件、复制链接、下载文件都必须用浏览器打开网页,而且还要登录,感觉好麻烦啊,干脆就自己开发了一个这样的工具(使用JavaFX编写),打包成可执行的jar包**
44

5-
**主要功能就是文件的上传下载,获取存储空间中的文件列表,搜索文件(支持正则表达式),复制文件外链,删除文件,移动(或复制)文件,重命名文件名,设置文件的生存时间**
5+
**主要功能就是文件的上传下载,获取存储空间中的文件列表,搜索文件(支持正则表达式),复制文件外链,删除文件,移动(或复制)文件,重命名文件名,设置文件的生存时间等**
66

77
**功能截图:**
88

9-
- 主窗口界面:
9+
**1. 主窗口界面:**
1010

11-
![程序主界面](http://img.blog.csdn.net/20171015221834257?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
11+
![程序主界面](http://img.blog.csdn.net/20171015221834257?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1212

13-
- 资源管理界面:
13+
- 设置文件前缀
1414

15-
![资源管理界面](http://img.blog.csdn.net/20171015222108447?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
16-
17-
> 说明:操作文件时,需要选中文件才能操作(支持多选),由于下载私有空间的文件需要临时授权,所以文件的下载分为私有下载(生成临时授权然后下载文件)和公有下载(直接下载文件)。
15+
路径前缀可以用来分类文件,例如: `image/jpg/`your-file-name.jpg
1816

19-
*移动文件的界面:*
17+
- 添加存储空间
2018

19+
添加存储空间,需要同时指定空间名称,空间域名以及所在区域
20+
21+
![添加存储空间](http://img.blog.csdn.net/20171017122858110?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
22+
23+
- 重置密钥
24+
25+
如果你修改了Key,可以在此处修改密钥
26+
27+
![重置密钥](http://img.blog.csdn.net/20171017123714044?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
28+
29+
> 说明:出于安全考虑,建议您周期性地更换密钥。[密钥安全使用须知](https://developer.qiniu.com/kodo/kb/1334/the-access-key-secret-key-encryption-key-safe-use-instructions)
30+
31+
- 配置文件
32+
33+
Windows使用路径:`C:/Program Files/Qiniu Tool`
34+
35+
MacOS 或 Linux 使用路径:`/tmp/qiniu/tool`
36+
37+
其中 `config.json` 为配置文件
38+
39+
**2. 资源管理界面:**
40+
41+
![资源管理界面](http://img.blog.csdn.net/20171017111653241?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
42+
43+
- 刷新列表
44+
45+
刷新当前存储空间的资源列表
46+
47+
- 复制链接
48+
49+
复制你选中文件的外链
50+
51+
- 删除文件
52+
53+
从存储空间中删除你选中的所有文件
54+
55+
- 移动文件
56+
57+
移动(或复制)选中的所有文件到指定的存储空间中(目前好像七牛还不支持跨区域移动文件)
58+
2159
![移动文件界面](http://img.blog.csdn.net/20171015222512819?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY5NTQ3NzM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2260

2361
> 说明:勾选“保存文件副本”时表示当前操作为复制,不勾选时表示移动(会删除本存储空间的文件),默认勾选。
2462
63+
- 生存时间
64+
65+
设置选中文件的生存时间,到期后七牛会自动删除这些文件
66+
67+
- 更新镜像
68+
69+
需要选中文件才能更新,但是这个功能我一直没有测试成功,不知道为什么
70+
71+
> 官方解释:对于配置了镜像存储的空间,如果镜像源站更新了文件内容,则默认情况下,七牛不会再主动从客户镜像源站同步新的副本,这个时候就需要利用这个prefetch接口来主动地将空间中的文件和更新后的源站副本进行同步。
72+
73+
或许是我没有配置什么镜像存储吧
74+
75+
- 公有下载
76+
77+
直接下载选中的文件(私有的存储空间不可用)
78+
79+
- 私有下载
80+
81+
下载选中的私有存储空间的文件
82+
83+
- 打开文件
84+
85+
用浏览器打开你选中的文件
86+
87+
- 链接下载
88+
89+
由于这两天迅雷抽风了,下载出现BUG,所以提供了这样一个临时的下载方案,打开后直接输入链接即可下载
90+
91+
- 文件刷新
92+
93+
从七牛云镜像源刷新你选中的文件,保证用户下载的是最新上传的文件,而不是之前的旧版本(个人感觉和 `更新镜像` 是一样的)
94+
95+
- 日志下载
96+
97+
从七牛下载指定日期的操作日志
98+
99+
**说明:操作文件时,需要选中文件才能操作(支持多选)。由于下载私有空间的文件需要临时授权,所以文件的下载分为私有下载(生成临时授权然后下载文件)和公有下载(直接下载文件)。**
100+
101+
**3. 其他**
102+
103+
- [**下载可执行的jar包**](http://oq3iwfipo.bkt.clouddn.com/tools/zhazhapan/qiniu.jar "七牛云——对象存储管理工具jar包下载地址")
104+
105+
- [**历史版本**](https://github.com/zhazhapan/qiniu/releases)
25106

26-
- [**历史版本**](https://github.com/zhazhapan/qiniu/releases)[**直接下载**](http://oq3iwfipo.bkt.clouddn.com/tools/zhazhapan/qiniu.jar?v=1.0.1 "七牛云——对象存储管理工具jar包下载地址")
107+
- [**项目源代码**](https://github.com/zhazhapan/qiniu "七牛云——对象存储管理工具项目源码地址")
27108

28-
- [**项目源代码**](https://github.com/zhazhapan/qiniu "七牛云——对象存储管理工具项目源码地址")
109+
- [**官方JavaSDK文档**](https://developer.qiniu.com/kodo/sdk/1239/java)

src/main/java/com/zhazhapan/qiniu/QiManager.java

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@
77
import java.net.URLEncoder;
88
import java.util.ArrayList;
99
import java.util.Date;
10+
import java.util.Map;
1011

1112
import org.apache.log4j.Logger;
1213

14+
import com.qiniu.cdn.CdnResult;
15+
import com.qiniu.cdn.CdnResult.LogData;
1316
import com.qiniu.common.QiniuException;
1417
import com.qiniu.http.Response;
1518
import com.qiniu.storage.BucketManager;
@@ -39,27 +42,83 @@ public enum FileAction {
3942
}
4043

4144
/**
42-
* 私有下载
45+
* 日志下载,cdn相关
4346
*/
47+
public void downloadCdnLog(String logDate) {
48+
if (Checker.isNotEmpty(QiniuApplication.buckets) && Checker.isDate(logDate)) {
49+
String[] domains = new String[QiniuApplication.buckets.size()];
50+
int i = 0;
51+
for (Map.Entry<String, String> bucket : QiniuApplication.buckets.entrySet()) {
52+
domains[i] = bucket.getValue().split(" ")[1];
53+
i++;
54+
}
55+
try {
56+
CdnResult.LogListResult logRes = QiniuApplication.cdnManager.getCdnLogList(domains, logDate);
57+
Downloader downloader = new Downloader();
58+
for (Map.Entry<String, LogData[]> logs : logRes.data.entrySet()) {
59+
for (LogData log : logs.getValue()) {
60+
downloader.downloadFromNet(log.url);
61+
}
62+
}
63+
} catch (QiniuException e) {
64+
logger.error("get cdn log url error, message: " + e.getMessage());
65+
Dialogs.showException(e);
66+
}
67+
}
68+
}
69+
70+
/**
71+
* 刷新文件,cdn相关
72+
*/
73+
public void refreshFile(ObservableList<FileInfo> fileInfos, String domain) {
74+
if (Checker.isNotEmpty(fileInfos)) {
75+
String[] files = new String[fileInfos.size()];
76+
int i = 0;
77+
for (FileInfo fileInfo : fileInfos) {
78+
files[i] = getPublicURL(fileInfo.getName(), domain);
79+
i++;
80+
}
81+
try {
82+
// 单次方法调用刷新的链接不可以超过100个
83+
QiniuApplication.cdnManager.refreshUrls(files);
84+
logger.info("refresh files success");
85+
} catch (QiniuException e) {
86+
logger.error("refresh files error, message: " + e.getMessage());
87+
Dialogs.showException(e);
88+
}
89+
}
90+
}
91+
4492
public void privateDownload(String fileName, String domain) {
93+
privateDownload(fileName, domain, new Downloader());
94+
}
95+
96+
/**
97+
* 私有下载
98+
*/
99+
public void privateDownload(String fileName, String domain, Downloader downloader) {
45100
try {
46101
String encodedFileName = URLEncoder.encode(fileName, "utf-8");
47102
String publicUrl = String.format("%s/%s", domain, encodedFileName);
48103
// 自定义链接过期时间(小时)
49104
long expireInSeconds = 24;
50-
new Downloader().downloadFromNet(QiniuApplication.auth.privateDownloadUrl(publicUrl, expireInSeconds));
105+
downloader.downloadFromNet(QiniuApplication.auth.privateDownloadUrl(publicUrl, expireInSeconds));
51106
} catch (UnsupportedEncodingException e) {
52107
urlError(e);
53108
}
54109
}
55110

111+
public void publicDownload(String fileName, String domain) {
112+
publicDownload(fileName, domain, new Downloader());
113+
}
114+
56115
/**
57116
* 公有下载
58117
*/
59-
public void publicDownload(String fileName, String domain) {
118+
public void publicDownload(String fileName, String domain, Downloader downloader) {
60119
String url = getPublicURL(fileName, domain);
61120
if (Checker.isNotEmpty(url)) {
62-
new Downloader().downloadFromNet(url);
121+
downloader.downloadFromNet(url);
63122
}
64123
}
65124

src/main/java/com/zhazhapan/qiniu/QiniuApplication.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.apache.log4j.Logger;
88
import org.springframework.boot.autoconfigure.SpringBootApplication;
99

10+
import com.qiniu.cdn.CdnManager;
1011
import com.qiniu.common.Zone;
1112
import com.qiniu.storage.BucketManager;
1213
import com.qiniu.storage.Configuration;
@@ -64,6 +65,8 @@ public class QiniuApplication extends Application {
6465

6566
public static String downloadPath = null;
6667

68+
public static CdnManager cdnManager = null;
69+
6770
/**
6871
* 主程序入口
6972
*/

src/main/java/com/zhazhapan/qiniu/config/QiConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.apache.log4j.Logger;
1212

13+
import com.qiniu.cdn.CdnManager;
1314
import com.qiniu.storage.BucketManager;
1415
import com.qiniu.storage.Configuration;
1516
import com.qiniu.storage.UploadManager;
@@ -35,6 +36,7 @@ public class QiConfig {
3536
*/
3637
public void createAuth(String ak, String sk) {
3738
QiniuApplication.auth = Auth.create(ak, sk);
39+
QiniuApplication.cdnManager = new CdnManager(QiniuApplication.auth);
3840
}
3941

4042
/**

src/main/java/com/zhazhapan/qiniu/controller/MainWindowController.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ private void initialize() {
190190
});
191191
// 超链接添加监听
192192
toCsdnBlog.setOnAction(e -> Utils.openLink("http://csdn.zhazhapan.com"));
193-
toHexoBlog.setOnAction(e -> Utils.openLink("http://hexo.zhazhapan.com"));
193+
toHexoBlog.setOnAction(e -> Utils.openLink("http://zhazhapan.com"));
194194
toGithubSource.setOnAction(e -> Utils.openLink("https://github.com/zhazhapan/qiniu"));
195195
String introPage = "http://zhazhapan.com/2017/10/15/%E4%B8%83%E7%89%9B%E4%BA%91%E2%80"
196196
+ "%94%E2%80%94%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E7%AE%A1%E7%90%86%E5%B7%A5"
@@ -199,6 +199,22 @@ private void initialize() {
199199
toIntro1.setOnAction(e -> Utils.openLink("http://blog.csdn.net/qq_26954773/article/details/78245100"));
200200
}
201201

202+
/**
203+
* 日志下载,cdn相关
204+
*/
205+
public void downloadCdnLog() {
206+
String date = Dialogs.showInputDialog(null, Values.INPUT_LOG_DATE, Formatter.dateToString(new Date()));
207+
new QiManager().downloadCdnLog(date);
208+
}
209+
210+
/**
211+
* 文件刷新,cdn相关
212+
*/
213+
public void refreshFile() {
214+
new QiManager().refreshFile(resTable.getSelectionModel().getSelectedItems(),
215+
"http://" + bucketDomainTextField.getText());
216+
}
217+
202218
/**
203219
* 通过链接下载其他的网络文件
204220
*/
@@ -231,15 +247,16 @@ public void download(DownloadWay way) {
231247
if (Checker.isNotEmpty(selectedItems)) {
232248
QiManager manager = new QiManager();
233249
String domain = "http://" + bucketDomainTextField.getText();
250+
Downloader downloader = new Downloader();
234251
if (way == DownloadWay.PUBLIC) {
235252
logger.debug("start to public download");
236253
for (FileInfo fileInfo : selectedItems) {
237-
manager.publicDownload(fileInfo.getName(), domain);
254+
manager.publicDownload(fileInfo.getName(), domain, downloader);
238255
}
239256
} else {
240257
logger.debug("start to private download");
241258
for (FileInfo fileInfo : selectedItems) {
242-
manager.privateDownload(fileInfo.getName(), domain);
259+
manager.privateDownload(fileInfo.getName(), domain, downloader);
243260
}
244261
}
245262
}
@@ -545,7 +562,10 @@ public void openConfigFile() {
545562
* 重置Key
546563
*/
547564
public void resetKey() {
548-
ConfigLoader.showInputKeyDialog();
565+
boolean ok = new Dialogs().showInputKeyDialog();
566+
if (ok && Checker.isNotEmpty(zoneText.getText())) {
567+
new QiConfig().configUploadEnv(zoneText.getText(), bucketChoiceCombo.getValue());
568+
}
549569
}
550570

551571
/**

src/main/java/com/zhazhapan/qiniu/modules/constant/Values.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
*/
1010
public class Values {
1111

12+
public static final String QINIU_KEY_URL = "https://portal.qiniu.com/user/key";
13+
1214
public static final String MAIN_TITLE = "七牛云管理工具";
1315

1416
public static final String INIT_APP_ERROR_HEADER = "初始化错误,无法继续运行";
1517

16-
public static final String APP_PATH_OF_WINDOWS = "C:/program files/Qiniu Tool";
18+
public static final String APP_PATH_OF_WINDOWS = "C:/Program Files/Qiniu Tool";
1719

1820
public static final String APP_PATH_OF_UNIX = "/tmp/qiniu/tool";
1921

@@ -102,4 +104,6 @@ public class Values {
102104
public static final String OPEN_LINK_ERROR = "打开链接失败";
103105

104106
public static final String DOWNLOAD_URL = "下载链接";
107+
108+
public static final String INPUT_LOG_DATE = "请输入日志的日期";
105109
}

src/main/java/com/zhazhapan/qiniu/util/Checker.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package com.zhazhapan.qiniu.util;
55

66
import java.util.List;
7+
import java.util.Map;
78
import java.util.regex.Pattern;
89

910
/**
@@ -15,8 +16,14 @@ public class Checker {
1516
public static final Pattern HYPER_LINK_PATTERN = Pattern
1617
.compile("^(https*://)?([a-z0-9]+\\.)+[a-z0-9]+(/[^\\s]*)*$", Pattern.CASE_INSENSITIVE);
1718

19+
public static final Pattern DATE_PATTERN = Pattern.compile("^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$");
20+
1821
public static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9]+$");
1922

23+
public static boolean isDate(String date) {
24+
return isNull(date) ? false : DATE_PATTERN.matcher(date).matches();
25+
}
26+
2027
public static boolean isNumber(String string) {
2128
return isNull(string) ? false : NUMBER_PATTERN.matcher(string).matches();
2229
}
@@ -49,6 +56,14 @@ public static boolean isEmpty(List<?> list) {
4956
return isNull(list) ? true : list.isEmpty();
5057
}
5158

59+
public static boolean isNotEmpty(Map<?, ?> map) {
60+
return !isEmpty(map);
61+
}
62+
63+
public static boolean isEmpty(Map<?, ?> map) {
64+
return isNull(map) ? true : map.isEmpty();
65+
}
66+
5267
public static boolean isHyperLink(String string) {
5368
if (isNotEmpty(string)) {
5469
return HYPER_LINK_PATTERN.matcher(string).matches();

src/main/java/com/zhazhapan/qiniu/util/Formatter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public static int stringToInt(String string) {
3535
return 0;
3636
}
3737

38-
public static final Pattern FILE_NAME_PATTERN = Pattern
39-
.compile("(([^/\\\\:*\"<>|?]+)\\.)*[^/\\\\:*\"<>|?]+(\\?.*)?$", Pattern.CASE_INSENSITIVE);
38+
public static final Pattern FILE_NAME_PATTERN = Pattern.compile("([^/\\\\:*\"<>|?]+\\.)*[^/\\\\:*\"<>|?]+(\\?.*)?$",
39+
Pattern.CASE_INSENSITIVE);
4040

4141
public static String formatSize(long size) {
4242
if (size < Values.KB) {

0 commit comments

Comments
 (0)