上传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服务器改为打开服务器上的端口以进行传输,并且客户端连接到该端口。

+0

我试图在服务器上存储文件之前添加了行,现在它说java.net.SocketException:连接重置 – 2012-04-23 18:10:50

+0

我相信它需要调用连接前调用,而不是。尝试检查javadoc http://commons.apache.org/net/api-3.1/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode() – 2012-04-23 18:15:58

+0

@Karuvägistaja你可以发布新的例外吗?你在防火墙后面吗? – 2012-04-23 18:20:13

在堆栈跟踪一个人看到该文件被转移为文本,而不是BINARY,这可能改变了文件,并且不能与NUL等

client.type(FTP.BINARY_FILE_TYPE); 

交易,但特别@Kal是正确的。

+0

它说找不到变量FTP,Kal的解决方案没有任何改变。 – 2012-04-23 18:09:42

+0

您可以使用FTPClient.BINARY_FILE_TYPE。类FTPClient在定义了常量的地方扩展了FTP。对不起,Kal的解决方案不起作用;听起来似乎合理,因为你的代码看起来没问题。 – 2012-04-23 21:09:39

+1

解决了我不得不添加:netsh advfirewall设置全局StatefulFTP禁用在命令promp中的管理员权限。这是Windows机器上的Java 7错误 – 2012-04-25 10:29:03