我正在使用commons-net FTPClient上传一些文件.
如何获得上传进度(现在上传的字节数)?
谢谢
我的要求是从不同的目录获取所需文件扩展名的文件列表,并在获取文件本身时我应该获取输入流并进行一些处理....我试图获取具有所需文件扩展名的文件列表,然后我试图从该列表中的所有选定文件获取输入流.对于第一次迭代,我得到所需的文件,我也得到一个文件的流,但对于下一个文件,我得到一个空指针异常.我也无法从第二次迭代中获取文件列表
我用来测试的示例代码:
System.out.println(ftp.printWorkingDirectory());
boolean status = ftp
.changeWorkingDirectory("mydirectory");
System.out.println("Status of Change Directory:" + status);
System.out.println(ftp.printWorkingDirectory());
InputStream is = null;
System.out.println(ftp.printWorkingDirectory());
System.out.println(ftp.isConnected());
FTPFile[] list2 = ftp.listFiles();
System.out.println("Number of files in this directory:"
+ list2.length);
for (int i = 0; i < list2.length; i++) {
System.out.println("-------[" + list2[i].getName()
+ "]---------------------");
is = ftp.retrieveFileStream(list2[i].getName());
int bytesRead = 0;
byte[] buffer = new byte[1024];
while ((bytesRead = is.read(buffer, 0, buffer.length)) > 0) {
System.out.println(new String(buffer, 0, bytesRead));
}
//is.close();
System.out.println("-------[END:" + list2[i].getName()
+ "]---------------------"); …Run Code Online (Sandbox Code Playgroud) 我使用apache.commons.net -framework 在java中实现了FTPS客户端(FTP over SSL/TLS).它被配置为在默认端口21上执行显式安全性.
ftpsClient = new FTPSClient(false);
ftpsClient.setTrustManager(getConfiguration().getCertificatesManager());
ftpsClient.connect(getConfiguration().getHostName(), getConfiguration().getPort());
Run Code Online (Sandbox Code Playgroud)
只要我不在服务器上强制执行客户端身份验证,一切正常.但我需要启用客户端身份验证,因此我在服务器上强制执行它并配置客户端系统属性:
-Djavax.net.ssl.keyStore="D:/.../ftps-client-auth.keystore"
-Djavax.net.ssl.keyStorePassword="*****"
-Djavax.net.ssl.keyStoreType=JKS
Run Code Online (Sandbox Code Playgroud)
我得到的就像我没有设置系统属性一样:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1806)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:986)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:265)
at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:207)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:172)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:192)
Run Code Online (Sandbox Code Playgroud)
服务器日志说:
DEBUG: Client "<my ip address>", "SSL_accept failed: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate"
Run Code Online (Sandbox Code Playgroud)
似乎没错 - 我启用了-Djavax.net.debug = all,这表明服务器发送了它接受的CN列表,但是客户端发送了一个空的证书链.
我正在开发一个小程序,它可以将文件上传到我的FTP服务器并用它做一些其他的事情.现在......一切正常,我正在使用org.apache.commons.net.ftp FTPClient该类进行上传.
ftp = new FTPClient();
ftp.connect(hostname);
ftp.login(username, password);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.changeWorkingDirectory("/shares/public");
int reply = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(reply)) {
addLog("Uploading...");
} else {
addLog("Failed connection to the server!");
}
File f1 = new File(location);
in = new FileInputStream(
ftp.storeFile(jTextField1.getText(), in);
addLog("Done");
ftp.logout();
ftp.disconnect();
Run Code Online (Sandbox Code Playgroud)
应上传的文件在hTextField1中命名.现在......我如何添加进度条?我的意思是,ftp.storeFile中没有流...我该如何处理?
谢谢你的帮助!:)
问候
首先,我知道这里有一个类似的问题,但它并没有回答我的疑问。我有一个配置了 SSL 的 FTPS 服务器 (vsftpd)。
我已经生成了适当的密钥:
openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \
-keyout private/vsftpd.key \
-out certs/vsftpd.crt
Run Code Online (Sandbox Code Playgroud)
并在服务器中配置了相应的conf文件。
现在,在使用 Apache commons net 的 Java 客户端代码中,我可以通过 SSL 与服务器进行通信,如下所示:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
public class CommonsNetFTPSTest {
public static void main(String[] args) throws Exception {
System.setProperty("javax.net.debug", "ssl");
String server = "XXX.XXX.XXX.XXX";
String username = "USER_TEST";
String password = "ABCD1234";
String remoteFile = "/Data/Input/PH240819";
String localFile = …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache Commons Net的FtpClient将视频上传到FTP服务器.要检查文件是否确实已成功传输,我想计算远程文件的校验和,但遗憾的是我发现没有可用的相关API.
我的问题是:是否需要在ftp服务器中计算文件校验和?
如果答案是肯定的,那么如何在FtpClient中获取校验和?
如果答案是否定的,那么FtpClient如何知道文件是否真的成功并完全转移?
我正在使用FTPClient针对 FTP 服务器使用Testcontainers.
可重现的代码示例如下:
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import static org.assertj.core.api.Assertions.assertThat;
@Testcontainers
class FtpUtilsTest {
private static final int PORT = 21;
private static final String USER = "user";
private static final String PASSWORD = "password";
private static final int FTP_TIMEOUT_IN_MILLISECONDS = 1000 * 60;
private static final GenericContainer ftp = new …Run Code Online (Sandbox Code Playgroud) 每次尝试连接时,都会收到异常“连接未打开”。当我尝试通过 FileZilla 或浏览器访问时,服务器运行良好。
我正在使用 apache-common-net 库。
private Boolean downloadAndSaveFile(String server, int portNumber,
String user, String password, String filename, File localFile)
throws IOException {
FTPClient ftp = null;
try {
ftp = new FTPClient();
ftp.connect(server, portNumber);
ftp.login(user, password);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
OutputStream outputStream = null;
boolean success = false;
try {
outputStream = new BufferedOutputStream(new FileOutputStream(
localFile));
success = ftp.retrieveFile(filename, outputStream);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
return success;
} finally {
if (ftp != null) { …Run Code Online (Sandbox Code Playgroud) 我试图从 FTP 环境中获取文件的最后修改日期。结果不符合预期。
通过使用ftpClient.getModificationTime("File path")我得到null。
通过使用FTPFile.getTimestamp().getTime()我得到了错误的最后修改(即真正的最后修改是今天,我得到的是Wed Feb 18 02:55:22 EST 2004)。
如何获得正确的最后修改时间?
提前致谢。
Apache Commons Net 库似乎没有向任何“记录器”发送任何内容。
我可以以某种方式从(FTP)会话中获取日志文件以进行调试吗?例如来自服务器的原始 FTP 命令和响应,如下所示:
220 Welcome
USER *******
331 Password required for ...
PASS *******
230 Logged on
TYPE I
200 Type set to I
QUIT
221 Goodbye
Run Code Online (Sandbox Code Playgroud) java ×9
ftp ×7
ftp-client ×4
ftps ×2
ssl ×2
android ×1
checksum ×1
logging ×1
progress-bar ×1
timestamp ×1