2025年4月21日16:47:17

master
qmstyle 2025-04-21 16:47:23 +08:00
parent 9699a6f811
commit a345943568
5 changed files with 104 additions and 51 deletions

BIN
imges/img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
imges/img_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
imges/img_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

14
readme.md Normal file
View File

@ -0,0 +1,14 @@
> 一个简单的minio的客户端
![](imges/img.png)
### 1.功能
- 创建bucket
- 上传文件
![](imges/img_1.png)
- url预览
![](imges/img_2.png)

View File

@ -21,6 +21,11 @@ import javafx.scene.layout.AnchorPane;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -83,26 +88,26 @@ public class MinioController {
public TableView<BucketFile> tableview; public TableView<BucketFile> tableview;
@FXML @FXML
public TableColumn<BucketFile,String> file_name; public TableColumn<BucketFile, String> file_name;
@FXML @FXML
public TableColumn<BucketFile,Number> file_size; public TableColumn<BucketFile, Number> file_size;
@FXML @FXML
public TableColumn<BucketFile,String> file_url; public TableColumn<BucketFile, String> file_url;
@FXML @FXML
public TableColumn<BucketFile,String> file_bucket; public TableColumn<BucketFile, String> file_bucket;
private File upload_file; private File upload_file;
@FXML @FXML
public void initialize() { public void initialize() {
tableview.setItems(list); tableview.setItems(list);
file_name.setCellValueFactory(new PropertyValueFactory<BucketFile,String>("fileName")); file_name.setCellValueFactory(new PropertyValueFactory<BucketFile, String>("fileName"));
file_size.setCellValueFactory(new PropertyValueFactory<BucketFile,Number>("size")); file_size.setCellValueFactory(new PropertyValueFactory<BucketFile, Number>("size"));
file_url.setCellValueFactory(new PropertyValueFactory<BucketFile,String>("url")); file_url.setCellValueFactory(new PropertyValueFactory<BucketFile, String>("url"));
file_bucket.setCellValueFactory(new PropertyValueFactory<BucketFile,String>("bucketName")); file_bucket.setCellValueFactory(new PropertyValueFactory<BucketFile, String>("bucketName"));
file_name.prefWidthProperty().bind(tableview.widthProperty().divide(tableview.getColumns().size())); file_name.prefWidthProperty().bind(tableview.widthProperty().divide(tableview.getColumns().size()));
file_size.prefWidthProperty().bind(tableview.widthProperty().divide(tableview.getColumns().size())); file_size.prefWidthProperty().bind(tableview.widthProperty().divide(tableview.getColumns().size()));
@ -111,10 +116,31 @@ public class MinioController {
// 创建上下文菜单 // 创建上下文菜单
final ContextMenu contextMenu = new ContextMenu(); final ContextMenu contextMenu = new ContextMenu();
MenuItem copyUrl = new MenuItem("copy url");
copyUrl.setOnAction(event -> {
BucketFile selectedItem = tableview.getSelectionModel().getSelectedItem();
// 获取系统剪贴板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 创建一个 StringSelection 对象,该对象封装了要复制的文本
Transferable transferableText = new StringSelection(selectedItem.getUrl());
// 将文本内容设置到剪贴板
clipboard.setContents(transferableText, null);
});
MenuItem menuItem = new MenuItem("删除"); MenuItem menuItem = new MenuItem("删除");
menuItem.setOnAction(event -> { menuItem.setOnAction(event -> {
list.remove(tableview.getSelectionModel().getSelectedItem()); list.remove(tableview.getSelectionModel().getSelectedItem());
// MinioUtils.delete_file();
}); });
contextMenu.getItems().add(copyUrl);
contextMenu.getItems().add(menuItem); contextMenu.getItems().add(menuItem);
// 添加事件监听器来处理上下文菜单的显示 // 添加事件监听器来处理上下文菜单的显示
tableview.setOnContextMenuRequested(event -> { tableview.setOnContextMenuRequested(event -> {
@ -147,7 +173,7 @@ public class MinioController {
fileInputStream = new FileInputStream(ResourceUtils.getPropertiesFile()); fileInputStream = new FileInputStream(ResourceUtils.getPropertiesFile());
byte[] bytes = fileInputStream.readAllBytes(); byte[] bytes = fileInputStream.readAllBytes();
text_area.setText(new String(bytes, StandardCharsets.UTF_8)); text_area.setText(new String(bytes, StandardCharsets.UTF_8));
Stage stage = AlertUtils.alert("minio 配置文件",root,600,410,(Stage) MinioUtils.objectMap.get(MinioUtils.primaryStage)); Stage stage = AlertUtils.alert("minio 配置文件", root, 600, 410, (Stage) MinioUtils.objectMap.get(MinioUtils.primaryStage));
save_p.setOnAction(event1 -> { save_p.setOnAction(event1 -> {
stage.close(); stage.close();
try { try {
@ -165,7 +191,7 @@ public class MinioController {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (fileInputStream != null){ if (fileInputStream != null) {
try { try {
fileInputStream.close(); fileInputStream.close();
} catch (IOException e) { } catch (IOException e) {
@ -178,10 +204,13 @@ public class MinioController {
KeyCombination kc2 = KeyCombination.valueOf("ctrl+r"); KeyCombination kc2 = KeyCombination.valueOf("ctrl+r");
reload_config.setAccelerator(kc2); reload_config.setAccelerator(kc2);
reload_config.setOnAction(event -> {
load_property();
});
KeyCombination kc3 = KeyCombination.valueOf("ctrl+b"); KeyCombination kc3 = KeyCombination.valueOf("ctrl+b");
bucket_choose.setAccelerator(kc3); bucket_choose.setAccelerator(kc3);
MinioUtils.objectMap.put(MinioUtils.minioController,this); MinioUtils.objectMap.put(MinioUtils.minioController, this);
choose_upload_file.setOnAction(event -> { choose_upload_file.setOnAction(event -> {
//打开文件 //打开文件
@ -190,7 +219,7 @@ public class MinioController {
dc.setTitle("文件选择"); dc.setTitle("文件选择");
dc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("文件类型", "*.*")); dc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("文件类型", "*.*"));
File file = dc.showOpenDialog(stage); File file = dc.showOpenDialog(stage);
if (file != null){ if (file != null) {
//展示路径 //展示路径
upload_file = file; upload_file = file;
upload_path.setText(file.getAbsolutePath()); upload_path.setText(file.getAbsolutePath());
@ -199,35 +228,37 @@ public class MinioController {
upload.setOnAction(event -> { upload.setOnAction(event -> {
if (upload_file == null){ if (upload_file == null) {
AlertUtils.alert_warning("请选择上传的文件后再试!"); AlertUtils.alert_warning("请选择上传的文件后再试!");
return; return;
} }
MinioUtils.upload_file(upload_file); MinioUtils.upload_file(upload_file);
reload();
}); });
bucket_btn.setOnAction(event -> { bucket_btn.setOnAction(event -> {
if (endpoint.getText().length() == 0 ){ if (endpoint.getText().length() == 0) {
AlertUtils.alert_warning("endpoint 不能为空!"); AlertUtils.alert_warning("endpoint 不能为空!");
return; return;
} }
if (accessKey.getText().length() == 0 ){ if (accessKey.getText().length() == 0) {
AlertUtils.alert_warning("accessKey 不能为空!"); AlertUtils.alert_warning("accessKey 不能为空!");
return; return;
} }
if (secretKey.getText().length() == 0 ){ if (secretKey.getText().length() == 0) {
AlertUtils.alert_warning("secretKey 不能为空!"); AlertUtils.alert_warning("secretKey 不能为空!");
return; return;
} }
if (bucket_name.getText().length() == 0 ){ if (bucket_name.getText().length() == 0) {
AlertUtils.alert_warning("bucket_name 不能为空!"); AlertUtils.alert_warning("bucket_name 不能为空!");
return; return;
} }
MinioUtils.createBucket(bucket_name.getText()); MinioUtils.createBucket(bucket_name.getText());
load_bucket_list();
}); });
load_property(); load_property();
@ -237,26 +268,27 @@ public class MinioController {
backet_list.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { backet_list.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
@Override @Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if (newValue != null){ if (newValue != null) {
MinioUtils.objectMap.put(MinioUtils.current_bucket,newValue); MinioUtils.objectMap.put(MinioUtils.current_bucket, newValue);
reload(); reload();
} }
} }
}); });
backet_list.setItems(backet_item_list);
} }
public void save_properties(){ public void save_properties() {
if (endpoint.getText().length() == 0 ){ if (endpoint.getText().length() == 0) {
AlertUtils.alert_warning("endpoint 不能为空!"); AlertUtils.alert_warning("endpoint 不能为空!");
return; return;
} }
if (accessKey.getText().length() == 0 ){ if (accessKey.getText().length() == 0) {
AlertUtils.alert_warning("accessKey 不能为空!"); AlertUtils.alert_warning("accessKey 不能为空!");
return; return;
} }
if (secretKey.getText().length() == 0 ){ if (secretKey.getText().length() == 0) {
AlertUtils.alert_warning("secretKey 不能为空!"); AlertUtils.alert_warning("secretKey 不能为空!");
return; return;
} }
@ -264,7 +296,7 @@ public class MinioController {
// 创建一个Properties对象 // 创建一个Properties对象
Properties properties = new Properties(); Properties properties = new Properties();
File file = ResourceUtils.getPropertiesFile(); File file = ResourceUtils.getPropertiesFile();
if (file != null){ if (file != null) {
InputStream input = null; InputStream input = null;
OutputStream output = null; OutputStream output = null;
try { try {
@ -272,10 +304,10 @@ public class MinioController {
output = new FileOutputStream(file); output = new FileOutputStream(file);
// load a properties file // load a properties file
properties.load(input); properties.load(input);
properties.put("endpoint",this.endpoint.getText()); properties.put("endpoint", this.endpoint.getText());
properties.put("accessKey",this.accessKey.getText()); properties.put("accessKey", this.accessKey.getText());
properties.put("secretKey",this.secretKey.getText()); properties.put("secretKey", this.secretKey.getText());
properties.store(output,"save"); properties.store(output, "save");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
@ -286,10 +318,10 @@ public class MinioController {
e.printStackTrace(); e.printStackTrace();
} }
} }
if (output != null){ if (output != null) {
try { try {
output.close(); output.close();
}catch (IOException e){ } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -299,10 +331,23 @@ public class MinioController {
} }
} }
public void load_property(){ public void load_bucket_list() {
//刷新bucket列表
//获取所有储存桶
backet_item_list.clear();
List<Bucket> buckets = MinioUtils.getAllBuckets();
if (buckets.size() > 0) {
for (Bucket bucket : buckets) {
backet_item_list.add(bucket.name());
}
}
this.backet_list.getSelectionModel().select(bucket_name.getText());
}
public void load_property() {
Properties prop = new Properties(); Properties prop = new Properties();
File file = ResourceUtils.getPropertiesFile(); File file = ResourceUtils.getPropertiesFile();
if (file != null){ if (file != null) {
InputStream input = null; InputStream input = null;
try { try {
input = new FileInputStream(file); input = new FileInputStream(file);
@ -316,9 +361,9 @@ public class MinioController {
String secretKey = prop.getProperty("secretKey"); String secretKey = prop.getProperty("secretKey");
this.secretKey.setText(secretKey); this.secretKey.setText(secretKey);
MinioUtils.objectMap.put("endpoint",endpoint); MinioUtils.objectMap.put("endpoint", endpoint);
MinioUtils.objectMap.put("accessKey",accessKey); MinioUtils.objectMap.put("accessKey", accessKey);
MinioUtils.objectMap.put("secretKey",secretKey); MinioUtils.objectMap.put("secretKey", secretKey);
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
} finally { } finally {
@ -332,20 +377,13 @@ public class MinioController {
} }
} }
//获取所有储存桶 load_bucket_list();
List<Bucket> buckets = MinioUtils.getAllBuckets();
if (buckets.size()>0){
for (Bucket bucket : buckets) {
backet_item_list.add(bucket.name());
}
}
this.backet_list.setItems(backet_item_list);
} }
@FXML @FXML
private void bucket_choose_action(){ private void bucket_choose_action() {
Stage primaryStage = (Stage) this.choose_upload_file.getScene().getWindow(); Stage primaryStage = (Stage) this.choose_upload_file.getScene().getWindow();
FXMLLoader fxmlLoader =new FXMLLoader( getClass().getResource("/fxml/bucket_choose.fxml")); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/bucket_choose.fxml"));
AnchorPane bucket_choose = null; AnchorPane bucket_choose = null;
try { try {
bucket_choose = fxmlLoader.load(); bucket_choose = fxmlLoader.load();
@ -353,20 +391,21 @@ public class MinioController {
e.printStackTrace(); e.printStackTrace();
} }
Stage stage = AlertUtils.alert("设置", bucket_choose, primaryStage); Stage stage = AlertUtils.alert("设置", bucket_choose, primaryStage);
MinioUtils.objectMap.put(MinioUtils.bucket_choose_action_stage,stage); MinioUtils.objectMap.put(MinioUtils.bucket_choose_action_stage, stage);
} }
@FXML @FXML
public void reload(){ public void reload() {
Object obj = MinioUtils.objectMap.get(MinioUtils.current_bucket); Object obj = MinioUtils.objectMap.get(MinioUtils.current_bucket);
if (obj == null){ if (obj == null) {
AlertUtils.alert_warning("请选择bucket再试"); AlertUtils.alert_warning("请选择bucket再试");
return; return;
} }
list.clear();
String bucketName = obj.toString(); String bucketName = obj.toString();
List<BucketFile> bucketFiles = MinioUtils.getFileList(bucketName); List<BucketFile> bucketFiles = MinioUtils.getFileList(bucketName);
if (bucketFiles.size()>0){ if (bucketFiles.size() > 0) {
list.clear();
list.addAll(bucketFiles); list.addAll(bucketFiles);
} }
} }