gpt4 book ai didi

java - FTPClient 如何解决 org.apache.commons.net.io.CopyStreamException : IOException caught while copying

转载 作者:行者123 更新时间:2023-12-02 10:56:03 30 4
gpt4 key购买 nike

我正在尝试使用 Apache Commons Net FTPSClient 将带有 Java 应用程序的 .zip 文件上传到 FTP 服务器。

<pre><code>import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPSClient;

public class FTPUploader {
/**
* Zips the source file first and then uploads it to the ftp server
* @param source - The file to be uploaded
* @param target - The file on the ftp server to upload to
*/
public static void upload(String source, String target){
BufferedInputStream stream = null;
File zippedFile = new File("/temp/"+UUID.randomUUID()+".zip");
File targetFile = new File(target);
FTPSClient client = new FTPSClient();
System.out.println("[FTPClient] Starting Upload of "+source+" to "+target);
try {
//Establish connection to FTP Server
client.connect("localhost");
client.login("user", "password"); //changed
client.setFileType(FTP.BINARY_FILE_TYPE);
client.enterLocalPassiveMode();
client.execPBSZ(0);
client.execPROT("P");
//Get the original File
File file = new File(source);
//Zip the file before uploading
if(file.isDirectory()){
ZipUtil.zipDirectory(source, zippedFile.getPath());
}
else{
ZipUtil.zipFile(source, zippedFile.getPath());
}
//Go to the directory on the ftp server
String directoryPath = targetFile.getParentFile().getPath();
//If it doesn't exist create it
if(!client.changeWorkingDirectory(directoryPath)){
client.makeDirectory(directoryPath);
client.changeWorkingDirectory(directoryPath);
}
//Create an InputStream of the zipped file to be uploaded
stream = new BufferedInputStream(new FileInputStream(zippedFile));
//Store zipped file to server
if(client.storeFile(targetFile.getName(), stream)){
System.out.println("[FTPClient] Done!");
}
else{
System.out.println("[FTPClient] Upload failed: "+client.getReplyString());
}
//Finish up
client.logout();
} catch (IOException e) {
System.out.println("[FTPClient] Error! Last Reply: "+client.getReplyString());
e.printStackTrace();
} finally {
try {
if (stream != null) {
stream.close();
}
client.disconnect();
zippedFile.delete();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

org.apache.commons.net.io.CopyStreamException: IOException caught while copying.
at org.apache.commons.net.io.Util.copyStream(Util.java:136)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:675)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:639)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:2030)
... 2 more
Caused by: java.net.SocketException: Broken pipe (Write failed)
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:886)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:857)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at org.apache.commons.net.io.Util.copyStream(Util.java:124)
... 5 more</code></pre>

我检查的事情:

  • 与 FTP 服务器的连接正常
  • 登录成功
  • FTP 服务器上的目录已成功创建
  • 在 FTP 服务器上创建具有正确名称的空 .zip 文件
  • 远程目录的权限为 755(可以写入)
  • 本地和远程文件路径均正确且本地文件存在

有人知道如何解决这个错误吗?

最佳答案

该问题是由 FTP 服务器引起的。它有一个设置,强制 FTP 客户端在数据通道上重用来自控制 channel 的 SSL session ,而 apache commons FTP 客户端显然不会这样做。使用“TLSOptions NoSessionReuseRequired”禁用服务器上的要求解决了该问题。

值得注意的是,该要求似乎有安全背景,因为当不需要使用相同的 SSL session 时,数据通道可能会被劫持。请参阅这个答案:https://stackoverflow.com/a/32404418/10173457

关于java - FTPClient 如何解决 org.apache.commons.net.io.CopyStreamException : IOException caught while copying,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51730863/

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