Skip to content

Commit b333050

Browse files
authored
improved ftp client (#1193)
- supports emoji - supports symlink - better handling of video, image - show names instead of path
1 parent b5fa065 commit b333050

File tree

2 files changed

+46
-7
lines changed

2 files changed

+46
-7
lines changed

src/plugins/ftp/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</config-file>
2020

2121
<source-file src="src/android/com/foxdebug/ftp/Ftp.java" target-dir="src/com/foxdebug/ftp" />
22-
<framework src="commons-net:commons-net:3.9.0" />
22+
<framework src="commons-net:commons-net:3.11.1" />
2323
</platform>
2424

2525
</plugin>

src/plugins/ftp/src/android/com/foxdebug/ftp/Ftp.java

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@
1111
import java.io.InputStream;
1212
import java.io.OutputStream;
1313
import java.io.PrintWriter;
14+
import java.io.UnsupportedEncodingException;
1415
import java.lang.SecurityException;
1516
import java.lang.reflect.Method;
1617
import java.net.SocketException;
1718
import java.net.URI;
1819
import java.net.URISyntaxException;
1920
import java.net.URISyntaxException;
21+
import java.net.URLDecoder;
22+
import java.net.URLEncoder;
23+
import java.nio.charset.StandardCharsets;
2024
import java.util.ArrayList;
25+
import java.util.Arrays;
2126
import java.util.HashMap;
2227
import java.util.List;
2328
import org.apache.commons.net.ftp.*;
@@ -101,6 +106,9 @@ public void run() {
101106
ftp = ftpProfiles.get(ftpId);
102107
reply = ftp.getReplyCode();
103108
if (ftp.isConnected() && FTPReply.isPositiveCompletion(reply)) {
109+
ftp.setControlEncoding("UTF-8");
110+
ftp.setAutodetectUTF8(true);
111+
System.setProperty("ftp.client.encoding", "UTF-8");
104112
// test if connection is still valid
105113
ftp.sendNoOp();
106114
Log.d("FTP", "FTPClient (" + ftpId + ") is connected");
@@ -240,11 +248,38 @@ public void run() {
240248
JSONObject jsonFile = new JSONObject();
241249
jsonFile.put("name", filename);
242250
jsonFile.put("size", file.getSize());
243-
jsonFile.put("isDirectory", file.isDirectory());
244-
jsonFile.put("isFile", file.isFile());
245-
jsonFile.put("isSymbolicLink", file.isSymbolicLink());
246-
jsonFile.put("link", file.getLink());
247251
jsonFile.put("url", joinPath(path, filename));
252+
253+
if (file.isSymbolicLink()) {
254+
jsonFile.put("isLink", true);
255+
String linkTarget = file.getLink();
256+
jsonFile.put("link", linkTarget);
257+
String linkPath = linkTarget.startsWith("/")
258+
? linkTarget
259+
: joinPath(path, linkTarget);
260+
try {
261+
FTPFile[] targetFiles = ftp.listFiles(linkPath);
262+
if (targetFiles.length > 0) {
263+
FTPFile targetFile = targetFiles[0];
264+
jsonFile.put("isFile", targetFile.isFile());
265+
jsonFile.put("isDirectory", targetFile.isDirectory());
266+
jsonFile.put("url", linkPath);
267+
} else {
268+
jsonFile.put("isFile", false);
269+
jsonFile.put("isDirectory", false);
270+
}
271+
} catch (Exception e) {
272+
// Handle broken symlink
273+
jsonFile.put("isFile", false);
274+
jsonFile.put("isDirectory", false);
275+
}
276+
} else {
277+
jsonFile.put("isLink", false);
278+
jsonFile.put("isDirectory", file.isDirectory());
279+
jsonFile.put("isFile", file.isFile());
280+
jsonFile.put("link", null);
281+
}
282+
248283
jsonFile.put(
249284
"lastModified",
250285
file.getTimestamp().getTimeInMillis()
@@ -558,6 +593,8 @@ public void run() {
558593
return;
559594
}
560595

596+
ftp.setFileType(FTP.BINARY_FILE_TYPE);
597+
561598
InputStream inputStream = ftp.retrieveFileStream(path);
562599
if (inputStream == null) {
563600
Log.d(
@@ -635,6 +672,8 @@ public void run() {
635672
return;
636673
}
637674

675+
ftp.setFileType(FTP.BINARY_FILE_TYPE);
676+
638677
Log.d("FTPUpload", "Destination " + remoteFilePath);
639678
OutputStream outputStream = ftp.storeFileStream(remoteFilePath);
640679
if (outputStream == null) {
@@ -977,10 +1016,10 @@ public void run() {
9771016
stat.put("isValid", file.isValid());
9781017
stat.put("isUnknown", file.isUnknown());
9791018
stat.put("isDirectory", file.isDirectory());
980-
stat.put("isSymbolicLink", file.isSymbolicLink());
1019+
stat.put("isLink", file.isSymbolicLink());
9811020
stat.put("linkCount", file.getHardLinkCount());
9821021
stat.put("size", file.getSize());
983-
stat.put("name", file.getName());
1022+
stat.put("name", getBaseName(file.getName()));
9841023
stat.put("lastModified", file.getTimestamp().getTimeInMillis());
9851024
stat.put("link", file.getLink());
9861025
stat.put("group", file.getGroup());

0 commit comments

Comments
 (0)