Skip to content

Commit

Permalink
improved ftp client (#1193)
Browse files Browse the repository at this point in the history
- supports emoji
- supports symlink
- better handling of video, image
- show names instead of path
  • Loading branch information
bajrangCoder authored Feb 22, 2025
1 parent b5fa065 commit b333050
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/plugins/ftp/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
</config-file>

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

</plugin>
51 changes: 45 additions & 6 deletions src/plugins/ftp/src/android/com/foxdebug/ftp/Ftp.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,18 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.SecurityException;
import java.lang.reflect.Method;
import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.net.ftp.*;
Expand Down Expand Up @@ -101,6 +106,9 @@ public void run() {
ftp = ftpProfiles.get(ftpId);
reply = ftp.getReplyCode();
if (ftp.isConnected() && FTPReply.isPositiveCompletion(reply)) {
ftp.setControlEncoding("UTF-8");
ftp.setAutodetectUTF8(true);
System.setProperty("ftp.client.encoding", "UTF-8");
// test if connection is still valid
ftp.sendNoOp();
Log.d("FTP", "FTPClient (" + ftpId + ") is connected");
Expand Down Expand Up @@ -240,11 +248,38 @@ public void run() {
JSONObject jsonFile = new JSONObject();
jsonFile.put("name", filename);
jsonFile.put("size", file.getSize());
jsonFile.put("isDirectory", file.isDirectory());
jsonFile.put("isFile", file.isFile());
jsonFile.put("isSymbolicLink", file.isSymbolicLink());
jsonFile.put("link", file.getLink());
jsonFile.put("url", joinPath(path, filename));

if (file.isSymbolicLink()) {
jsonFile.put("isLink", true);
String linkTarget = file.getLink();
jsonFile.put("link", linkTarget);
String linkPath = linkTarget.startsWith("/")
? linkTarget
: joinPath(path, linkTarget);
try {
FTPFile[] targetFiles = ftp.listFiles(linkPath);
if (targetFiles.length > 0) {
FTPFile targetFile = targetFiles[0];
jsonFile.put("isFile", targetFile.isFile());
jsonFile.put("isDirectory", targetFile.isDirectory());
jsonFile.put("url", linkPath);
} else {
jsonFile.put("isFile", false);
jsonFile.put("isDirectory", false);
}
} catch (Exception e) {
// Handle broken symlink
jsonFile.put("isFile", false);
jsonFile.put("isDirectory", false);
}
} else {
jsonFile.put("isLink", false);
jsonFile.put("isDirectory", file.isDirectory());
jsonFile.put("isFile", file.isFile());
jsonFile.put("link", null);
}

jsonFile.put(
"lastModified",
file.getTimestamp().getTimeInMillis()
Expand Down Expand Up @@ -558,6 +593,8 @@ public void run() {
return;
}

ftp.setFileType(FTP.BINARY_FILE_TYPE);

InputStream inputStream = ftp.retrieveFileStream(path);
if (inputStream == null) {
Log.d(
Expand Down Expand Up @@ -635,6 +672,8 @@ public void run() {
return;
}

ftp.setFileType(FTP.BINARY_FILE_TYPE);

Log.d("FTPUpload", "Destination " + remoteFilePath);
OutputStream outputStream = ftp.storeFileStream(remoteFilePath);
if (outputStream == null) {
Expand Down Expand Up @@ -977,10 +1016,10 @@ public void run() {
stat.put("isValid", file.isValid());
stat.put("isUnknown", file.isUnknown());
stat.put("isDirectory", file.isDirectory());
stat.put("isSymbolicLink", file.isSymbolicLink());
stat.put("isLink", file.isSymbolicLink());
stat.put("linkCount", file.getHardLinkCount());
stat.put("size", file.getSize());
stat.put("name", file.getName());
stat.put("name", getBaseName(file.getName()));
stat.put("lastModified", file.getTimestamp().getTimeInMillis());
stat.put("link", file.getLink());
stat.put("group", file.getGroup());
Expand Down

0 comments on commit b333050

Please sign in to comment.