mirror of
https://gitee.com/willfree/minoaClientWindows_gradle.git
synced 2026-06-17 11:40:39 +08:00
877 lines
30 KiB
Java
877 lines
30 KiB
Java
package cn.minoa.view.mine;
|
||
|
||
import java.io.File;
|
||
import java.io.IOException;
|
||
import java.util.LinkedList;
|
||
/*
|
||
* 数据格式说明:
|
||
* f 普通文件
|
||
* o 其它文件
|
||
* d 文件夹目录
|
||
* .前端一个listview表项是一个pane,其id是"路径+纯文件名+@文件类型"
|
||
*/
|
||
import java.util.List;
|
||
|
||
import org.json.JSONArray;
|
||
import org.json.JSONException;
|
||
import org.json.JSONObject;
|
||
|
||
import cn.minoa.MainApp;
|
||
import cn.minoa.dataRequestInterface.OrderInfo;
|
||
import cn.minoa.dataRequestInterface.ResponseData;
|
||
import javafx.fxml.FXML;
|
||
import javafx.scene.control.Alert;
|
||
import javafx.scene.control.Button;
|
||
import javafx.scene.control.ListView;
|
||
import javafx.scene.control.Alert.AlertType;
|
||
import javafx.scene.layout.Pane;
|
||
import javafx.scene.text.Text;
|
||
import javafx.stage.DirectoryChooser;
|
||
import javafx.stage.FileChooser;
|
||
import javafx.stage.Stage;
|
||
|
||
public class MyCloudFileController {
|
||
private MainApp mainApp;
|
||
@SuppressWarnings("unused")
|
||
private Stage dialogStage;
|
||
// 当前所在路径
|
||
private String currentPath;
|
||
// 当前路径下的文件列表[path+file+@type]
|
||
private List<String> filePathnameList;
|
||
|
||
@FXML
|
||
private Text pathText;
|
||
@FXML
|
||
private ListView<Pane> fileList;
|
||
@FXML
|
||
private Button deleteSelectedButton;
|
||
@FXML
|
||
private Button downloadTheFileButton;
|
||
|
||
// 构造函数
|
||
public MyCloudFileController() {
|
||
// TODO Auto-generated constructor stub
|
||
currentPath = "/";
|
||
filePathnameList = new LinkedList<String>();
|
||
}
|
||
|
||
@FXML
|
||
private void initialize() {
|
||
// 在fxml被载入时候被自动调用
|
||
// 默认删除按钮不可用
|
||
deleteSelectedButton.setDisable(true);
|
||
downloadTheFileButton.setDisable(true);
|
||
// 监听选择的改变
|
||
fileList.getSelectionModel().selectedItemProperty()
|
||
.addListener((observable, oldValue, newValue) -> showLowerLevel(newValue.getId()));
|
||
}
|
||
|
||
/*
|
||
* @param mainApp
|
||
*/
|
||
public void setMainApp(MainApp mainApp) {
|
||
this.mainApp = mainApp;
|
||
// 发送命令请求主目录下的文件夹列表,赋值给filePathnameList
|
||
lsFolder(currentPath);
|
||
// 更新显示到前端
|
||
pathText.setText("当前文件路径:/");
|
||
for (int i = 0; i < filePathnameList.size(); i++) {
|
||
fileList.getItems().add(new FileListItem(filePathnameList.get(i)).getPaneItem());
|
||
}
|
||
}
|
||
|
||
/*
|
||
* @param mainApp
|
||
*/
|
||
public void setMainApp(MainApp mainApp, String iniCurrentPath) {
|
||
this.mainApp = mainApp;
|
||
// 发送命令请求主目录下的文件夹列表,赋值给filePathnameList
|
||
this.currentPath = iniCurrentPath;
|
||
lsFolder(currentPath);
|
||
// 更新显示到前端
|
||
pathText.setText("当前文件路径:" + currentPath);
|
||
for (int i = 0; i < filePathnameList.size(); i++) {
|
||
fileList.getItems().add(new FileListItem(filePathnameList.get(i)).getPaneItem());
|
||
}
|
||
}
|
||
|
||
// 点击事件触发:展示下一级目录
|
||
private void showLowerLevel(String paneId) {
|
||
// 判断是否是文件夹,是,则进入下一个界面
|
||
if (checkFolder(paneId)) {
|
||
// 修改按钮属性
|
||
deleteSelectedButton.setDisable(true);
|
||
downloadTheFileButton.setDisable(true);
|
||
// 修改当前路径
|
||
currentPath = getFolderName(paneId);
|
||
// 根据当前路径,重新加载整个界面,来刷新listview
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} else if (checkFile(paneId)) {
|
||
// 修改按钮属性
|
||
deleteSelectedButton.setDisable(false);
|
||
downloadTheFileButton.setDisable(false);
|
||
}
|
||
}
|
||
|
||
// 返回上一级按钮
|
||
@FXML
|
||
private void returnToUpperLevel() {
|
||
// 显示上一级目录信息
|
||
if (!currentPath.equals("/")) {
|
||
// 获取上一级路径
|
||
currentPath = getUpperLevelPath(currentPath);
|
||
pathText.setText("当前文件路径:" + currentPath);
|
||
// 根据当前路径,重新加载整个界面,来刷新listview
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("无上一级目录");
|
||
alert.setHeaderText("无法返回上一级");
|
||
alert.setContentText("您已经到达文件根目录," + "无法返回上一级目录了哦~");
|
||
alert.showAndWait();
|
||
}
|
||
}
|
||
|
||
// 上传文件到当前文件路径
|
||
@FXML
|
||
private void uploadFileToCurrentPath() {
|
||
FileChooser fileChooser = new FileChooser();
|
||
fileChooser.setTitle("选择上传文件");
|
||
Stage selectFileStage = new Stage();
|
||
File file = fileChooser.showOpenDialog(selectFileStage);
|
||
if (file != null) {
|
||
// 文件不为空,且不是文件夹
|
||
if (file.isFile()) {
|
||
//判断文件长度是否为0
|
||
System.out.println("file length: "+file.length());
|
||
if(file.length()==0){
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("空文件错误");
|
||
alert.setHeaderText("您选择的是一个空文件");
|
||
alert.setContentText("您选择的是一个空文件,请重新选择。");
|
||
alert.showAndWait();
|
||
return ;
|
||
}
|
||
System.out.println("开始文件上传... :" + file.getAbsolutePath());
|
||
// 版1【默认根目录】:
|
||
// sendFileToServer(file);
|
||
// 版2【无进度条】:
|
||
// Integer r=mainApp.uploadFileToServerPath(file, currentPath + "/");
|
||
// 版3【有进度条】:
|
||
mainApp.uploadFileToServerPathWithProgressBar(file, currentPath + "/");
|
||
// 判断是否手动取消了上传,是的话就不进行下面的判断
|
||
if(mainApp.isCancelFileTransferFlag){
|
||
return;
|
||
}
|
||
// 上传文件之后,通过获取上传到服务器的文件大小,与本地文件大小对比
|
||
// 判断是否传输成功
|
||
String serverPathname;
|
||
if(currentPath.equals("/")){
|
||
serverPathname=currentPath+file.getName();
|
||
}else{
|
||
serverPathname=currentPath+"/"+file.getName();
|
||
}
|
||
Integer fileServerLength=mainApp.getServerFileByteLength(serverPathname);
|
||
System.out.println("fileServerLength: "+fileServerLength);
|
||
if(fileServerLength<0){
|
||
//文件未成功创建
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("文件上传失败");
|
||
alert.setHeaderText("文件上传失败");
|
||
alert.setContentText("由于未知原因,你的文件上传失败。");
|
||
alert.showAndWait();
|
||
}else if(fileServerLength== file.length()){
|
||
//文件全部成功上传
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("文件上传成功");
|
||
alert.setHeaderText("文件上传成功");
|
||
alert.setContentText("你的文件已经成功上传至服务器。");
|
||
alert.showAndWait();
|
||
}else{
|
||
//文件部分数据未成功写入
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("文件上传失败");
|
||
alert.setHeaderText("文件上传失败");
|
||
alert.setContentText("由于未知原因,你的文件数据未全部上传成功。");
|
||
alert.showAndWait();
|
||
}
|
||
// 根据当前路径,重新加载整个界面,来刷新listview
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("文件类型错误");
|
||
alert.setHeaderText("你的文件类型错误");
|
||
alert.setContentText("请确保你选中的是一个文件而非文件夹。");
|
||
alert.showAndWait();
|
||
}
|
||
}
|
||
}
|
||
|
||
// 在当前文件目录下新建文件夹
|
||
@FXML
|
||
private void mkdirOnCurrentPath() {
|
||
// 弹窗,请求输入文件夹名称
|
||
mainApp.showNewFolderDialog();
|
||
}
|
||
|
||
// 刷新当前文件列表
|
||
@FXML
|
||
private void reloadOnCurrentPath() {
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("刷新成功");
|
||
alert.setHeaderText("已成功刷新文件列表");
|
||
alert.setContentText("已成功刷新文件列表,当前是最新列表");
|
||
alert.showAndWait();
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("刷新失败");
|
||
alert.setHeaderText("刷新出现错误");
|
||
alert.setContentText("由于未知原因,您的刷新出现错误。");
|
||
alert.showAndWait();
|
||
}
|
||
}
|
||
|
||
public void makeDir(String foldername) {
|
||
foldername = currentPath + "/" + foldername;
|
||
// 请求数据
|
||
OrderInfo orderInfo = new OrderInfo();
|
||
ResponseData responseData = new ResponseData();
|
||
Long seqLong = mainApp.getNewDataReqId();
|
||
orderInfo.setSeq(seqLong);
|
||
orderInfo.setJsonString(getFileActionJson("mkdir", foldername));
|
||
System.out.println("getFileActionJson: " + getFileActionJson("mkdir", foldername));
|
||
mainApp.minoaDataAPI.executeOrder("/fileAction", orderInfo);
|
||
responseData = mainApp.minoaDataAPI.dataCacheQueue.getResponseDataBySeq(seqLong);
|
||
JSONObject jsonObject = responseData.praseRequestData();
|
||
responseData.printSelf();
|
||
// 解析数据
|
||
Integer codeInteger = null;
|
||
try {
|
||
codeInteger = jsonObject.getInt("code");
|
||
} catch (JSONException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
if (codeInteger == 200) {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("新建成功");
|
||
alert.setHeaderText("新建文件夹成功");
|
||
alert.setContentText("已在当前目录下新建文件夹。");
|
||
alert.showAndWait();
|
||
// 根据当前路径,重新加载整个界面,来刷新listview
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("新建失败");
|
||
alert.setHeaderText("新建文件夹失败");
|
||
alert.setContentText("由于未知原因,您在当前目录下不能新建文件夹。");
|
||
alert.showAndWait();
|
||
}
|
||
}
|
||
|
||
// 删除选中项按钮=>只支持删除普通文件
|
||
@FXML
|
||
private void deleteSelectedItem() {
|
||
System.out.println("发送了删除请求到服务器...");
|
||
// 获取选中的文件
|
||
Pane pane = fileList.getSelectionModel().getSelectedItem();
|
||
String pathfilename = getPathFileName(pane.getId());
|
||
if (checkFile(pane.getId())) {
|
||
// 请求数据
|
||
OrderInfo orderInfo = new OrderInfo();
|
||
ResponseData responseData = new ResponseData();
|
||
Long seqLong = mainApp.getNewDataReqId();
|
||
orderInfo.setSeq(seqLong);
|
||
orderInfo.setJsonString(getFileActionJson("rm", pathfilename));
|
||
System.out.println("getFileActionJson: " + getFileActionJson("rm", pathfilename));
|
||
mainApp.minoaDataAPI.executeOrder("/fileAction", orderInfo);
|
||
responseData = mainApp.minoaDataAPI.dataCacheQueue.getResponseDataBySeq(seqLong);
|
||
JSONObject jsonObject = responseData.praseRequestData();
|
||
responseData.printSelf();
|
||
// 解析数据
|
||
Integer codeInteger = null;
|
||
try {
|
||
codeInteger = jsonObject.getInt("code");
|
||
} catch (JSONException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
if (codeInteger == 200) {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("删除成功");
|
||
alert.setHeaderText("删除文件成功");
|
||
alert.setContentText("已从云端删除您选中的文件。");
|
||
alert.showAndWait();
|
||
// 根据当前路径,重新加载整个界面,来刷新listview
|
||
try {
|
||
mainApp.reloadCloudFileOverview(currentPath);
|
||
} catch (IOException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
} else {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("删除失败");
|
||
alert.setHeaderText("删除文件失败");
|
||
alert.setContentText("由于未知原因,您选中的文件不能被删除");
|
||
alert.showAndWait();
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// 下载选中项按钮,下载文件到缺省本地目录[E盘根目录]
|
||
// @FXML
|
||
// private void downloadSelectedItem() {
|
||
// Pane pane=fileList.getSelectionModel().getSelectedItem();
|
||
// String pathfilename=getPathFileName(pane.getId());
|
||
// System.out.println("开始下载... :"+pathfilename);
|
||
// int flag=mainApp.downloadFileByPathfilename(pathfilename);
|
||
// if(flag==0) {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.INFORMATION);
|
||
// alert.setTitle("下载成功");
|
||
// alert.setHeaderText("下载文件成功");
|
||
// alert.setContentText("您请求的文件数据已经被全部下载到本地,"
|
||
// + "如有发现打开异常或数据内容并非所求,说明出现了服务器数据请求问题。"
|
||
// + "您的文件默认保存位置为:"+mainApp.fileLocalPath);
|
||
// alert.showAndWait();
|
||
// }else {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.ERROR);
|
||
// alert.setTitle("下载失败");
|
||
// alert.setHeaderText("下载文件失败");
|
||
// alert.setContentText("本地文件数据写入失败,请检查是否有权限访问默认存储位置。"
|
||
// + "您的文件默认保存位置为:"+mainApp.fileLocalPath);
|
||
// alert.showAndWait();
|
||
// }
|
||
// }
|
||
|
||
// 下载选中项按钮
|
||
@FXML
|
||
private void downloadSelectedItem() {
|
||
// 选择要下载到的文件夹
|
||
String localDirString = mainApp.fileLocalPath;
|
||
DirectoryChooser directoryChooser = new DirectoryChooser();
|
||
directoryChooser.setTitle("选择要下载到的本地文件夹");
|
||
Stage selectFileStage = new Stage();
|
||
File file = directoryChooser.showDialog(selectFileStage);
|
||
if (file != null) {
|
||
// 文件不为空,且是一个文件夹
|
||
if (file.isDirectory()) {
|
||
localDirString = file.getPath() + "\\";
|
||
System.out.println("选中的本地保存文件夹为:" + localDirString);
|
||
} else {
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.WARNING);
|
||
alert.setTitle("选中类型错误");
|
||
alert.setHeaderText("你的选中类型错误");
|
||
alert.setContentText("请确保你选中的是一个文件夹而不是一个文件。");
|
||
alert.showAndWait();
|
||
return;
|
||
}
|
||
}else{
|
||
return ;
|
||
}
|
||
|
||
Pane pane = fileList.getSelectionModel().getSelectedItem();
|
||
String pathfilename = getPathFileName(pane.getId());
|
||
System.out.println("开始下载... :" + pathfilename);
|
||
mainApp.downloadFileByPathfilenameWithProgressBar(pathfilename,localDirString);
|
||
// 判断是否手动取消了下载,是的话就不进行下面的判断
|
||
if(mainApp.isCancelFileTransferFlag){
|
||
return;
|
||
}
|
||
// 下载文件之后,通过获取服务器的文件大小,与下载到本地的文件大小对比
|
||
// 判断是否传输成功
|
||
Integer fileServerLength=mainApp.getServerFileByteLength(pathfilename);
|
||
System.out.println("fileServerLength: "+fileServerLength);
|
||
String localfilename=localDirString+getPureFileNameFromLinux(pathfilename);
|
||
File localfile=new File(localfilename);
|
||
if(!localfile.exists()){
|
||
// 本地文件未被成功创建
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.ERROR);
|
||
alert.setTitle("下载失败");
|
||
alert.setHeaderText("下载文件失败");
|
||
alert.setContentText("本地文件未被成功创建,请检查是否有权限访问你选择的文件存储位置。" + "您的指定的文件保存位置为:" +localDirString);
|
||
alert.showAndWait();
|
||
}else if(localfile.length()==fileServerLength){
|
||
// 本地文件成功创建且字节长度与服务器一致
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.INFORMATION);
|
||
alert.setTitle("下载成功");
|
||
alert.setHeaderText("下载文件成功");
|
||
alert.setContentText("您请求的文件数据已经被全部下载到本地," + "您的文件保存位置为:"
|
||
+ localDirString);
|
||
alert.showAndWait();
|
||
}else{
|
||
// 本地文件成功创建但字节长度与服务器不一致
|
||
// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
Alert alert = new Alert(AlertType.ERROR);
|
||
alert.setTitle("下载失败");
|
||
alert.setHeaderText("下载文件失败");
|
||
alert.setContentText("文件数据未能全部写入本地。" + "您的文件保存位置为:" +localDirString);
|
||
alert.showAndWait();
|
||
}
|
||
// int flag = mainApp.downloadFileByPathfilename(pathfilename,localDirString);
|
||
// if (flag == 0) {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.INFORMATION);
|
||
// alert.setTitle("下载成功");
|
||
// alert.setHeaderText("下载文件成功");
|
||
// alert.setContentText("您请求的文件数据已经被全部下载到本地," + "如有发现打开异常或数据内容并非所求,说明出现了服务器数据请求问题。" + "您的文件保存位置为:"
|
||
// + localDirString);
|
||
// alert.showAndWait();
|
||
// } else {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.ERROR);
|
||
// alert.setTitle("下载失败");
|
||
// alert.setHeaderText("下载文件失败");
|
||
// alert.setContentText("本地文件数据写入失败,请检查是否有权限访问文件存储位置。" + "您的文件保存位置为:" +localDirString);
|
||
// alert.showAndWait();
|
||
// }
|
||
}
|
||
|
||
// 根据包含路径的文件名获取纯文件名[linux下]
|
||
public String getPureFileNameFromLinux(String pathfilename) {
|
||
// 标记最后一个/的下标
|
||
int indexLeft = -1;
|
||
for (int i = 0; i < pathfilename.length(); i++) {
|
||
if (pathfilename.charAt(i) == '/') {
|
||
indexLeft = i;
|
||
}
|
||
}
|
||
if (indexLeft == -1) {
|
||
System.out.println("pure name[linux]: " + pathfilename);
|
||
return pathfilename;
|
||
} else {
|
||
System.out.println("pure name[linux]: " + pathfilename.substring(indexLeft + 1, pathfilename.length()));
|
||
return pathfilename.substring(indexLeft + 1, pathfilename.length());
|
||
}
|
||
}
|
||
|
||
// 根据当前目录字符串获取上一层目录
|
||
private String getUpperLevelPath(String path) {
|
||
String upperPathString = "/";
|
||
// 标记最后一个/的下标
|
||
int index = 0;
|
||
for (int i = 0; i < path.length(); i++) {
|
||
if (path.charAt(i) == '/') {
|
||
index = i;
|
||
}
|
||
}
|
||
if (index != 0) {
|
||
upperPathString = path.substring(0, index);
|
||
}
|
||
return upperPathString;
|
||
}
|
||
|
||
// 文件操作命令
|
||
private String getFileActionJson(String cmd, String filename) {
|
||
JSONObject jsonObject = new JSONObject();
|
||
String commandString = "/fileAction";
|
||
String usernameString = mainApp.loginer.getUserName();
|
||
String uuidString = mainApp.loginer.getUuid();
|
||
String cmdString = cmd;
|
||
String filenameString = filename;
|
||
try {
|
||
jsonObject.put("command", commandString);
|
||
jsonObject.put("username", usernameString);
|
||
jsonObject.put("uuid", uuidString);
|
||
jsonObject.put("fileCmd", cmdString);
|
||
jsonObject.put("filename", filenameString);
|
||
} catch (Exception e) {
|
||
// TODO: handle exception
|
||
System.out.println("exception: " + e.getMessage());
|
||
}
|
||
return jsonObject.toString();
|
||
}
|
||
|
||
// 列出某目录下的所有文件
|
||
private boolean lsFolder(String foldername) {
|
||
System.out.println("foldername: " + foldername);
|
||
// 请求数据
|
||
OrderInfo orderInfo = new OrderInfo();
|
||
ResponseData responseData = new ResponseData();
|
||
Long seqLong = mainApp.getNewDataReqId();
|
||
orderInfo.setSeq(seqLong);
|
||
orderInfo.setJsonString(getFileActionJson("ls", foldername));
|
||
System.out.println("getFileActionJson: " + getFileActionJson("ls", foldername));
|
||
mainApp.minoaDataAPI.executeOrder("/fileAction", orderInfo);
|
||
responseData = mainApp.minoaDataAPI.dataCacheQueue.getResponseDataBySeq(seqLong);
|
||
JSONObject jsonObject = responseData.praseRequestData();
|
||
responseData.printSelf();
|
||
// 解析数据
|
||
Integer codeInteger = null;
|
||
try {
|
||
codeInteger = jsonObject.getInt("code");
|
||
} catch (JSONException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
if (codeInteger == 201) {
|
||
String dataString;
|
||
try {
|
||
dataString = jsonObject.getString("data");
|
||
if ((dataString.equals("")) || (dataString.equals("null"))) {
|
||
filePathnameList.clear();
|
||
return true;
|
||
}
|
||
JSONArray dataJsonArray = new JSONArray(dataString);
|
||
String fileCacheString;
|
||
JSONObject fileCacheJsonObject;
|
||
// 遍历每个文件信息
|
||
for (int i = 0; i < dataJsonArray.length(); i++) {
|
||
fileCacheString = dataJsonArray.getString(i);
|
||
fileCacheJsonObject = new JSONObject(fileCacheString);
|
||
String filename = fileCacheJsonObject.getString("filename");
|
||
String type = fileCacheJsonObject.getString("type");
|
||
if (foldername.charAt(foldername.length() - 1) == '/') {
|
||
filePathnameList.add(foldername + filename + "@" + type);
|
||
} else {
|
||
filePathnameList.add(foldername + '/' + filename + "@" + type);
|
||
}
|
||
}
|
||
return true;
|
||
} catch (JSONException e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
return false;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 获取上传文件的json格式
|
||
private String getUploadFile(String filename, Integer offset) {
|
||
JSONObject jsonObject = new JSONObject();
|
||
String commandString = "/uploadFile";
|
||
String usernameString = mainApp.loginer.getUserName();
|
||
String uuidString = mainApp.loginer.getUuid();
|
||
String filenameString = filename;
|
||
Integer offsetInteger = offset;
|
||
try {
|
||
jsonObject.put("command", commandString);
|
||
jsonObject.put("username", usernameString);
|
||
jsonObject.put("uuid", uuidString);
|
||
jsonObject.put("filename", filenameString);
|
||
jsonObject.put("offset", offsetInteger);
|
||
} catch (Exception e) {
|
||
// TODO: handle exception
|
||
System.out.println("exception: " + e.getMessage());
|
||
}
|
||
return jsonObject.toString();
|
||
}
|
||
|
||
// //上传文件操作=>此函数只支持上传指定文件到用户根目录
|
||
// public void sendFileToServer(File file) {
|
||
// // 获取要上传文件的文件长度,计算上传次数
|
||
// long filelen = file.length();
|
||
// int cycle = (int) filelen / mainApp.sliceSize;
|
||
// System.out.println("file-len: " + filelen);
|
||
// System.out.println("cycle: " + cycle);
|
||
// // 发送上传命令给上传接口,接口自行取本地数据
|
||
// int flagSuccess = 0; // 记录收到200回复的次数
|
||
// for (int i = 0; i <= cycle; i++) {
|
||
// OrderInfo orderInfo = new OrderInfo();
|
||
// ResponseData responseData = new ResponseData();
|
||
// Long seqLong = mainApp.getNewDataReqId();
|
||
// orderInfo.setSeq(seqLong);
|
||
// // 此时传入的文件路径是windows下的绝对路径
|
||
// orderInfo.setJsonString(getUploadFile(file.getAbsolutePath(), i * mainApp.sliceSize));
|
||
//
|
||
// mainApp.minoaDataAPI.executeOrder("/uploadFile", orderInfo);
|
||
// responseData = mainApp.minoaDataAPI.dataCacheQueue.getResponseDataBySeq(seqLong);
|
||
//// System.out.println("上传文件的数据回执(200表示成功):"+responseData.getResponseJsonDataString());
|
||
// JSONObject jsonObject = responseData.praseRequestData();
|
||
// responseData.printSelf();
|
||
// // 解析数据
|
||
// Integer codeInteger = null;
|
||
// try {
|
||
// codeInteger = jsonObject.getInt("code");
|
||
// } catch (JSONException e) {
|
||
// // TODO Auto-generated catch block
|
||
// e.printStackTrace();
|
||
// }
|
||
// if (codeInteger == 200) {
|
||
// flagSuccess++;
|
||
// }
|
||
// }
|
||
// // 每个分片都上传成功
|
||
// if (flagSuccess == (cycle + 1)) {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.INFORMATION);
|
||
// alert.setTitle("上传成功");
|
||
// alert.setHeaderText("上传文件成功");
|
||
// alert.setContentText("您的文件已上传。");
|
||
// alert.showAndWait();
|
||
// // 根据当前路径,重新加载整个界面,来刷新listview
|
||
// try {
|
||
// mainApp.reloadCloudFileOverview(currentPath);
|
||
// } catch (IOException e) {
|
||
// // TODO Auto-generated catch block
|
||
// e.printStackTrace();
|
||
// }
|
||
// } else {
|
||
//// 弹窗参考:https://code.makery.ch/blog/javafx-dialogs-official/
|
||
// Alert alert = new Alert(AlertType.WARNING);
|
||
// alert.setTitle("上传失败");
|
||
// alert.setHeaderText("上传文件失败");
|
||
// alert.setContentText("由于未知原因,您的文件上传失败,非常抱歉。");
|
||
// alert.showAndWait();
|
||
// }
|
||
// }
|
||
|
||
// 从paneId中获取文件所在路径
|
||
public String getPathFromPaneId(String paneId) {
|
||
// 标记最后一个/的下标
|
||
int indexLeft = -1;
|
||
// 标记最后一个@的下标
|
||
int indexRight = -1;
|
||
for (int i = 0; i < paneId.length(); i++) {
|
||
if (paneId.charAt(i) == '@') {
|
||
indexRight = i;
|
||
} else if (paneId.charAt(i) == '/') {
|
||
indexLeft = i;
|
||
}
|
||
}
|
||
if ((indexLeft == -1) || (indexRight == -1)) {
|
||
System.out.println("prase paneId error: " + paneId);
|
||
return "";
|
||
}
|
||
return paneId.substring(0, indexLeft);
|
||
}
|
||
|
||
// 从paneId中获取纯文件名
|
||
public String getPureFilenameFromPaneId(String paneId) {
|
||
// 标记最后一个/的下标
|
||
int indexLeft = -1;
|
||
// 标记最后一个@的下标
|
||
int indexRight = -1;
|
||
for (int i = 0; i < paneId.length(); i++) {
|
||
if (paneId.charAt(i) == '@') {
|
||
indexRight = i;
|
||
} else if (paneId.charAt(i) == '/') {
|
||
indexLeft = i;
|
||
}
|
||
}
|
||
if ((indexLeft == -1) || (indexRight == -1)) {
|
||
System.out.println("prase paneId error: " + paneId);
|
||
return "";
|
||
}
|
||
return paneId.substring(indexLeft + 1, indexRight);
|
||
}
|
||
|
||
// 从paneId中获取文件类型
|
||
private String getFileTypeFromPaneId(String paneId) {
|
||
return paneId.substring(paneId.length() - 1, paneId.length());
|
||
}
|
||
|
||
// 从paneId中获取文件夹路径[path+name]
|
||
private String getFolderName(String paneId) {
|
||
return paneId.substring(0, paneId.length() - 2);
|
||
}
|
||
|
||
// 从paneId中获取文件路径[path+name]
|
||
private String getPathFileName(String paneId) {
|
||
return paneId.substring(0, paneId.length() - 2);
|
||
}
|
||
|
||
// 判断是否是文件夹
|
||
private boolean checkFolder(String paneId) {
|
||
if (getFileTypeFromPaneId(paneId).equals("d")) {
|
||
return true;
|
||
} else if (paneId.equals("/")) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 判断是否是文件
|
||
private boolean checkFile(String paneId) {
|
||
if (getFileTypeFromPaneId(paneId).equals("f")) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
|
||
class FileListItem {
|
||
// 外部pane
|
||
private Pane pane;
|
||
private Integer paneWidth;
|
||
private Integer paneHeight;
|
||
// 头像
|
||
private Button head;
|
||
private Integer headLength;
|
||
// 文本区域
|
||
// public TextArea text;
|
||
private Text text;
|
||
// private Integer textWidth;
|
||
// private Integer textHeight;
|
||
|
||
// 每个Pane代映射了一个文件[路径+文件名+@文件类型]
|
||
String pathfilename;
|
||
|
||
// 组件位置属性
|
||
private Integer headXInteger;
|
||
private Integer headYInteger;
|
||
private Integer textXInteger;
|
||
private Integer textYInteger;
|
||
|
||
// 设置联系人头像
|
||
private void setHeadPortrait(Button button, String filetype) {
|
||
button.setStyle(
|
||
String.format("-fx-background-image: url('file:resources/images/myFileIcon/%s.png')", filetype));
|
||
}
|
||
|
||
// 构造函数
|
||
public FileListItem(String pathfiletypename) {
|
||
// 映射数据
|
||
this.pathfilename = pathfiletypename;
|
||
// 大小配置
|
||
paneWidth = 200;
|
||
paneHeight = 50;
|
||
headLength = 35;
|
||
// textWidth = 150;
|
||
// textHeight = 25;
|
||
// 位置配置
|
||
headXInteger = 10;
|
||
headYInteger = 10;
|
||
textXInteger = 70;
|
||
textYInteger = 28;
|
||
|
||
pane = new Pane();
|
||
head = new Button();
|
||
text = new Text();
|
||
|
||
// 最外面的pane的大小
|
||
pane.setPrefSize(paneWidth, paneHeight);
|
||
|
||
// 设置头像和pane的CSS的样式标识
|
||
head.getStyleClass().add("head");
|
||
pane.getStyleClass().add("pane");
|
||
|
||
// 设置消息头像和消息文本属性
|
||
head.setPrefSize(headLength, headLength);
|
||
// text.setPrefSize(textWidth, textHeight);
|
||
// text.setWrapText(true);
|
||
// text.setEditable(false);
|
||
}
|
||
|
||
public FileListItem(String pathfilename, String filetype) {
|
||
// 映射数据
|
||
this.pathfilename = pathfilename + "@" + filetype;
|
||
// 大小配置
|
||
paneWidth = 200;
|
||
paneHeight = 50;
|
||
headLength = 35;
|
||
// textWidth = 150;
|
||
// textHeight = 25;
|
||
// 位置配置
|
||
headXInteger = 10;
|
||
headYInteger = 10;
|
||
textXInteger = 70;
|
||
textYInteger = 28;
|
||
|
||
pane = new Pane();
|
||
head = new Button();
|
||
text = new Text();
|
||
|
||
// 最外面的pane的大小
|
||
pane.setPrefSize(paneWidth, paneHeight);
|
||
|
||
// 设置头像和pane的CSS的样式标识
|
||
head.getStyleClass().add("head");
|
||
pane.getStyleClass().add("pane");
|
||
|
||
// 设置消息头像和消息文本属性
|
||
head.setPrefSize(headLength, headLength);
|
||
// text.setPrefSize(textWidth, textHeight);
|
||
// text.setWrapText(true);
|
||
// text.setEditable(false);
|
||
}
|
||
|
||
// 根据person获取pane
|
||
public Pane getPaneItem() {
|
||
String name = this.pathfilename;
|
||
// 头像位置
|
||
head.setLayoutY(headYInteger);
|
||
head.setLayoutX(headXInteger);
|
||
// text位置
|
||
text.setLayoutX(textXInteger);
|
||
text.setLayoutY(textYInteger);
|
||
// 头像和气泡文本内容
|
||
text.setText(getPureFilenameFromPaneId(name));
|
||
// text.setText(name);
|
||
setHeadPortrait(head, getFileTypeFromPaneId(name));
|
||
pane.getChildren().add(head);
|
||
pane.getChildren().add(text);
|
||
// 设置pane的id
|
||
pane.setId(name);
|
||
return pane;
|
||
}
|
||
|
||
// 根据包含路径的文件名获取纯文件名
|
||
private String getPureFilenameFromPaneId(String paneId) {
|
||
// 标记最后一个/的下标
|
||
int indexLeft = -1;
|
||
// 标记最后一个@的下标
|
||
int indexRight = -1;
|
||
for (int i = 0; i < paneId.length(); i++) {
|
||
if (paneId.charAt(i) == '@') {
|
||
indexRight = i;
|
||
} else if (paneId.charAt(i) == '/') {
|
||
indexLeft = i;
|
||
}
|
||
}
|
||
if ((indexLeft == -1) || (indexRight == -1)) {
|
||
System.out.println("prase paneId error: " + paneId);
|
||
return "";
|
||
}
|
||
return paneId.substring(indexLeft + 1, indexRight);
|
||
}
|
||
|
||
// 从paneId中获取文件类型
|
||
private String getFileTypeFromPaneId(String paneId) {
|
||
return paneId.substring(paneId.length() - 1, paneId.length());
|
||
}
|
||
}
|