Java-код для FTP-клиента - PullRequest
1 голос
/ 16 июня 2011

Я написал простой код для загрузки файла с FTP-сервера, используя следующую строку подключения:

  URL url = new URL("ftp://test:pass@182.71.224.200/sample.txt;type=i");
    URLConnection urlc = url.openConnection();

Но пока я пытался прочитать содержимое из указанного выше подключения и записать на свой локальный дискЯ получил только 61 КБ.Когда я открыл sample.txt, он имеет следующее содержимое:

06-16-2011  02:47PM           1228317425 sample.txt

Но оригинальный размер файла sample.txt на FTP равен 1,14 ГБ.

urlc.getContentLength(), возвращено -1для меня.

вот мой весь код

public void download( String ftpServer, String user, String password,
             String fileName, File destination ) throws MalformedURLException,
             IOException
       {
          if (ftpServer != null && fileName != null && destination != null)
          {
             StringBuffer sb = new StringBuffer( "ftp://" );
             // check for authentication else assume its anonymous access.
             if (user != null && password != null)
             {
                sb.append( user );
                sb.append( ':' );
                sb.append( password );
                sb.append( '@' );
             }
             sb.append( ftpServer );
             sb.append( '/' );
             sb.append( fileName );
             /*
              * type ==> a=ASCII mode, i=image (binary) mode, d= file directory
              * listing
              */
             sb.append( ";type=i" );
             BufferedInputStream bis = null;
             BufferedOutputStream bos = null;
             System.out.println(sb);
             try
             {
                URL url = new URL( sb.toString() );
                URLConnection urlc = url.openConnection();
                System.out.println(urlc.getContentType());
                System.out.println(urlc.toString());
                System.out.println(urlc.getContentLength());
                bis = new BufferedInputStream( urlc.getInputStream() );
                bos = new BufferedOutputStream( new FileOutputStream("D://FTP/"+
                      destination.getName() ) );

                int i;
                while ((i = bis.read()) != -1)
                {
                   bos.write( i );
                }
             }
             finally
             {
                if (bis != null)
                   try
                   {
                      bis.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
                if (bos != null)
                   try
                   {
                      bos.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
             }
          }
          else
          {
             System.out.println( "Input not available" );
          }
       }

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Вам нужно будет открыть соединение и начать потоковую передачу, например,

URL url = new URL("ftp://test:pass@182.71.224.200/sample.txt;type=i");
URLConnection urlc = url.openConnection();
InputStream is = urlc.getInputStream(); // To download
etc. etc.

Ты это сделал? Основная поддержка JDK ограничена потоковой передачей данных. Возможно, вы захотите взглянуть на FTP-клиент Java, который позволяет более полно взаимодействовать с протоколом FTP. У меня нет большого опыта в этой области, но Apache Commons Net является одним из таких примеров. При этом вы будете читать файлы как org.apache.commons.net.ftp.FtpFile Объекты, которые имеют геттер для размера файла.

Кстати: -1 для вызова getContentLength() - это значение по умолчанию, если он не может найти заголовок с именем «content-length». Так что я думаю, что в вашем случае, потому что это FTP метод не имеет значения. Это добавляет вес, чтобы попытаться использовать выделенную библиотеку FTP.

1 голос
/ 16 июня 2011

Не нужно изобретать велосипед.Я бы порекомендовал использовать FTP4J, который я использовал в нескольких проектах для загрузки / выгрузки файлов.http://www.sauronsoftware.it/projects/ftp4j/. Я полагаю, что библиотека должна быть в состоянии решить ваши проблемы.

0 голосов
/ 16 июня 2011

Возможно, вы захотите использовать существующую библиотеку, а не сворачивать свою собственную, попробуйте Apache Commons Net .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...