【问题标题】:Java: upload file to FTP problem (packets lost)Java:上传文件到FTP问题(丢包)
【发布时间】:2011-01-19 02:29:33
【问题描述】:

我正在尝试将文件从我的 Java 应用程序传输到 FTP 服务器 程序正常工作,文件被传输,但是当我在 FTO 文件夹中打开时,文件已损坏,我认为在文件传输过程中数据包丢失。为什么?我该如何解决这个问题?

另一个问题,如果我想停止文件上传,如何停止while

谢谢大家!

我班里的代码:

FTPClient client = new FTPClient();
InputStream is = null;
//...
try{
 client.connect(MY_FTP_URL);
 client.login(USER, PASS);
 InputStream is = new FileInputStream(file_path);
 OutputStream os = client.storeFileStream(file_name);
 byte[] buffer = new byte[1024];
 int len;
 //I use this way to check the transfer progress
 while((len = is.read(buffer)) != -1){
  os.write(buffer, 0, len);
  os.flush();
 }
 os.close();
} catch (IOException e){
 e.printStackTrace();
} finally{
 try{
  if(is != null){
   is.close();
  }
  client.disconnect();
 } catch(IOException e){
  e.printStackTrace();
 }
}

【问题讨论】:

  • (1) 不要自己编写,使用库 (2) 除非绝对必要,否则不要使用 FTP,而是使用 SCP via JSch
  • 不确定您的问题是什么,但几乎可以肯定不是“丢包” - FTP 位于 TCP 之上,提供可靠的字节流。
  • 是的,这真的很奇怪,但输出文件包含的字符或行较少..(并且没有修剪)
  • 您使用的是什么操作系统?服务器运行的是什么操作系统?这可能是二进制文件传输的问题。
  • 如果您真的怀疑网络层,您可以使用 Wireshark 捕获您通过网络发送的数据。但是,除非您有充分的理由不这么认为,否则始终假定错误是您自己的代码是一个很好的一般规则。

标签: java ftp ftp-client apache-commons-net


【解决方案1】:

查看FAQ

问:为什么我的文件在之后损坏 转移?

答:最常见的原因是 当文件以 ASCII 格式传输时 但文件的内容不是 ASCII 和文件应该是 以二进制形式传输。 RFC 959 说 默认传输模式应该是 ASCII。 FTPClient 符合 标准。您必须显式调用 setFileType(FTP.BINARY_FILE_TYPE);到 请求二进制传输模式后 登录 FTP 服务器。

致电setFileType(FTP.BINARY_FILE_TYPE);

【讨论】:

    【解决方案2】:

    FTP 有两种模式 ASCII(通常为默认)和二进制。如果要传输文本以外的任何内容,则必须将客户端设置为二进制模式。

    如何设置模式因 FTP 客户端实现而异,但对于 Commons IO,请参阅 http://commons.apache.org/net/api/org/apache/commons/net/ftp/FTPClient.html#setFileType(int)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多