上传java中的文件到ftp服务器时出错
当我尝试上传文件到ftp服务器时,出现错误。该服务器是远程服务器,但它提供了ftp访问。这是我正在使用的代码上传java中的文件到ftp服务器时出错
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fileuploaddemo;
import org.apache.commons.net.ftp.FTPClient;
import java.io.FileInputStream;
import java.io.IOException;
public class FileUploadDemo {
public static void main(String[] args) {
FTPClient client = new FTPClient();
FileInputStream fis = null;
try {
client.connect("ftp.adress.comlu.com");
client.login("username", "mypass");
//
// Create an InputStream of the file to be uploaded
//
String filename = "D:/xxx/screen0.png";
fis = new FileInputStream(filename);
//
// Store file to server
//
client.storeFile(filename, fis);
client.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis != null) {
fis.close();
}
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这是程序输出。没有上传,我得到的只是这些行。
run:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.read(BufferedReader.java:175)
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:310)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:290)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:479)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:552)
at org.apache.commons.net.ftp.FTP.port(FTP.java:877)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:709)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:565)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:557)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1795)
at fileuploaddemo.FileUploadDemo.main(FileUploadDemo.java:29)
BUILD SUCCESSFUL (total time: 1 second)
可能是什么问题?
解决了我不得不添加:netsh advfirewall设置全局StatefulFTP禁用在管理员权限中的命令promp。这是Windows机器上的Java 7错误。
尝试,
client.enterLocalPassiveMode()
你开始转移之前。我怀疑你需要进入PASV模式进行数据传输。如果您位于路由器(NAT)或防火墙后面,可能会发生这种情况。 FTP服务器默认会尝试连接到您的数据连接,这意味着您开始监听某个端口并邀请服务器连接到它以传输数据。但是如果你在防火墙或路由器后面,服务器无法直接连接到你。 PASV模式指示FTP服务器改为打开服务器上的端口以进行传输,并且客户端连接到该端口。
在堆栈跟踪一个人看到该文件被转移为文本,而不是BINARY,这可能改变了文件,并且不能与NUL等
client.type(FTP.BINARY_FILE_TYPE);
交易,但特别@Kal是正确的。
它说找不到变量FTP,Kal的解决方案没有任何改变。 – 2012-04-23 18:09:42
您可以使用FTPClient.BINARY_FILE_TYPE。类FTPClient在定义了常量的地方扩展了FTP。对不起,Kal的解决方案不起作用;听起来似乎合理,因为你的代码看起来没问题。 – 2012-04-23 21:09:39
解决了我不得不添加:netsh advfirewall设置全局StatefulFTP禁用在命令promp中的管理员权限。这是Windows机器上的Java 7错误 – 2012-04-25 10:29:03
我试图在服务器上存储文件之前添加了行,现在它说java.net.SocketException:连接重置 – 2012-04-23 18:10:50
我相信它需要调用连接前调用,而不是。尝试检查javadoc http://commons.apache.org/net/api-3.1/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode() – 2012-04-23 18:15:58
@Karuvägistaja你可以发布新的例外吗?你在防火墙后面吗? – 2012-04-23 18:20:13