2012-04-23 4 views
2

Когда я пытаюсь загрузить файлы на 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) 

В чем может быть проблема?

ответ

0

Решено, что мне пришлось добавить: netsh advfirewall установить глобальный StatefulFTP disable В команде promp в правах администратора. Это ошибка Java 7 на машинах Windows.

5

Try,

client.enterLocalPassiveMode() 

, прежде чем начать передачу. Я подозреваю, что вам нужно перейти в режим PASV для передачи данных. Это может произойти в случае, если вы находитесь за маршрутизатором (NAT) или межсетевым экраном. FTP-сервер будет пытаться подключиться к вам для подключения к данным по умолчанию, что означает, что вы начинаете прослушивание на каком-то порту и приглашаете сервер для подключения к нему для передачи данных. Но если вы находитесь за брандмауэром или маршрутизатором, сервер не может напрямую подключиться к вам. Режим PASV указывает FTP-серверу вместо этого открыть порт на сервере для передачи, и клиент подключается к нему.

+0

Я добавил строку, прежде чем пытаться сохранить файл на сервере, и теперь он сказал java.net.SocketException: Connection reset –

+0

Я считаю, что его нужно вызывать перед вызовом connect. Попробуйте проверить javadoc http://commons.apache.org/net/api-3.1/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode() –

+0

@ Karuvägistaja можете ли вы опубликовать новое исключение? Вы за брандмауэром? –

0

В трассировке стека один видит, что файл переводится как текст, а не бинарным, что, возможно, приводит к изменению файла, и не может иметь дело с NUL и т.д.

client.type(FTP.BINARY_FILE_TYPE); 

Но особенно @Kal прав.

+0

говорит, что не может найти переменную FTP и решение Kal ничего не изменило. –

+0

Вы можете использовать FTPClient.BINARY_FILE_TYPE. Класс FTPClient расширяет FTP, где определена константа. Извините, что решение Kal не сработало; это звучало правдоподобно, так как ваш код выглядит нормально. –

+1

Решено, что мне пришлось добавить: netsh advfirewall установить глобальный StatefulFTP отключить В команде promp в правах администратора. Это ошибка Java 7 на компьютерах Windows –