gpt4 book ai didi

java - FTP 列表命令抛出 MalformedServerReplyException : Truncated server reply

转载 作者:行者123 更新时间:2023-11-30 10:07:53 26 4
gpt4 key购买 nike

我有一个使用 Apache Commons Net 将 mp3 上传到我的 FTP 服务器的 Java 应用程序。

但是,如果是新文件,则会抛出MalformedServerReplyException。如果是现有文件,它将完美上传并覆盖。

异常已经在行抛出:

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

但是,我检查了 Wireshark 并且命令 TYPE I 正常。

有人可以帮我解决这个问题吗?

这是异常之前的 Wireshark 图像: enter image description here

public static void transferFile(File file, boolean OverwriteAllowed) {
FtpLogin();
try {
System.out.println('\n');
System.out.println("DEBUG: "+ file.toString());

boolean isNewFile = false;
String filePath = getFtpPathToMusic() + file.getName();

ftpClient.sendNoOp();
showServerReply();

if (ftpClient.listFiles(filePath).length > 0) {
System.out.println("File exists, and overwrite allowed is: " + OverwriteAllowed);
} else {
isNewFile = true;
// System.out.println("File does not exist yet on server");
}

if (OverwriteAllowed || isNewFile) {
ftpClient.setStrictReplyParsing(false);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
showServerReply();
InputStream inputStream = new FileInputStream(file);


OutputStream outputStream = ftpClient.storeFileStream(filePath);
byte[] bytesIn = new byte[4096];
int read;
long remaining = file.length();
long transferred = 0;

System.out.println("Transfering data...");
while ((read = inputStream.read(bytesIn)) != -1) {
outputStream.write(bytesIn, 0, read);
remaining -= read;
transferred += read;
System.out.print('\r');
System.out.print("Remaining: " + remaining/1024 + "kb | Transferred: " + transferred/1024 + "kb");
}
System.out.println();
inputStream.close();
outputStream.close();

boolean completed = ftpClient.completePendingCommand();
if (completed) {
showServerReply();
System.out.println("File " + filePath + " uploaded succesfully");
}
} else {
System.out.println("File is skipped");
}
} catch (IOException e) {
e.printStackTrace();
showServerReply();
}

}

预期:上传成功
实际:MalformedServerReplyException

org.apache.commons.net.MalformedServerReplyException: Truncated server reply: 
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:332)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:300)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:523)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:648)
at org.apache.commons.net.ftp.FTP.type(FTP.java:1119)
at org.apache.commons.net.ftp.FTPClient.setFileType(FTPClient.java:1559)
at FtpSupport.FtpTransfer.transferFile(FtpTransfer.java:116)
at Home.ConverterGuiHome$convertMp3FilesExecute.actionPerformed(ConverterGuiHome.java:144)

应要求 - 完整的 (FTP) 日志记录:

Getting files from: /ideaProjects/GsmMp3Manager/src/main/Mp3Files/export
Creating mp3 object from file: 377 test.mp3
220 DiskStation FTP server ready.
SERVER: 220 DiskStation FTP server ready.
NOOP
200 NOOP command successful.
SERVER: 200 NOOP command successful.
USER *******
331 Password required for Barbet.
PASS *******
230 User Barbet logged in.
SERVER: 230 User Barbet logged in.
LOGGED IN SERVER
File listing in directory :
SYST
215 UNIX Type: L8
PASV
227 Entering Passive Mode (77,164,214,202,216,242)
LIST
150 Opening BINARY mode data connection for 'file list'.
226 Transfer complete.
[home] 4096 2018-12-12 00:00:00
[Spotlight] 4096 2018-11-17 00:00:00
[music] 4096 2018-11-22 00:00:00
[Mission Possible] 4096 2013-11-13 00:00:00
DEBUG:377 test.mp3


DEBUG: src/main/Mp3Files/export/377 test.mp3
NOOP
200 NOOP command successful.
SERVER: 200 NOOP command successful.
PASV
227 Entering Passive Mode (77,164,214,202,216,241)
LIST /Spotlight/muziek/377 test.mp3
150 Opening BINARY mode data connection for 'file list'.
550 /Spotlight/muziek/377 test.mp3: No such file or directory.
TYPE I
org.apache.commons.net.MalformedServerReplyException: Truncated server reply:
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:332)
(... see stack trace)

Close ftp session
QUIT
200 Type set to I.
SERVER: 200 Type set to I.

最佳答案

必须通过完整的 Wireshark 转储来确认,但我相信日志文件表明 550LIST 命令的响应后跟两个换行符。 Apache FTPClient 将第二个“行”视为对以下 TYPE I 命令的(无效)响应。所以它看起来像是一个服务器端错误。

您是否尝试过使用其他方法来检查文件是否存在?
请参阅我对 Checking file existence on FTP server 的回答
(正如答案所说,使用 listFiles 检查文件是否存在实际上违反了 FTP 协议(protocol))。

关于java - FTP 列表命令抛出 MalformedServerReplyException : Truncated server reply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54044947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com