Java загрузка файла через ftp ошибка нулевого байта - PullRequest
1 голос
/ 22 августа 2011

Я загрузил файл на сервер, но файл пуст. (Размер нулевого байта)

     int reply;
         ftp.connect(server,215);
         ftp.login(username, Password);
         System.out.println("Connected to " + server + ".");
         System.out.print(ftp.getReplyString());
         reply = ftp.getReplyCode();
         if(!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
         }
         System.out.println("FTP server connected.");
          ftp.setFileType(FTP.BINARY_FILE_TYPE);
          ftp.enterLocalPassiveMode();

         InputStream input= new FileInputStream(source_file_path);

         ftp.storeFile(dest_dir, input);
         System.out.println(ftp.storeFile(dest_dir, input));
         System.out.println( ftp.getReplyString() );

                            input.close();

                            ftp.logout();

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Вы храните файл дважды.

ftp.storeFile(dest_dir, input);
System.out.println(ftp.storeFile(dest_dir, input));

Поскольку вы не открываете входной поток, во второй раз, когда вы вызываете метод storeFile, входной поток имеет значение EOF, поэтому файл, который вы загружаете во второй раз, не будет иметь содержимого и, следовательно, будет перезаписывать первый файл.

Чтобы напечатать результат storeFile, вам необходимо:

Object result = ftp.storeFile(dest_dir, input);
System.out.println(result);
1 голос
/ 22 августа 2011

Глядя в свой код, я думаю, что вы используете сеть Джакарты.Если это правда, попробуйте это:

ftp.connect(address, port);
boolean ft = ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if(!ft)
    throw new Exception("Error");
ftp.enterLocalPassiveMode(); or ftp.enterLocalActiveMode();
boolean log = ftp.login(user, password);
//if log == true, then u are logged in
ftp.storeFile(remote, local);

Кроме того, если вы хотите использовать индикатор выполнения для получения прогресса передачи, вы можете попробовать этот метод вместо ftp.storeFile

InputStream stO = new BufferedInputStream(new FileInputStream(file), ftp.getBufferSize());
OutputStream stD = ftp.storeFileStream(file.getName());

                    org.apache.commons.net.io.Util.copyStream(
                    stO,
                    stD,
                    ftp.getBufferSize(),
                    file.length(),
                    new org.apache.commons.net.io.CopyStreamAdapter() 
                    {
                        @Override
                        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred,
                                long streamSize) 
                        {
                            try
                            {
                                pb.setMaximum((int)streamSize);
                                pb.setValue((int)totalBytesTransferred);
                            }
                            catch(Exception ex)
                            {
                                pb.setMaximum(-1);
                            }
                        }
                    });
                    stO.close();
                    stD.close();
                    boolean ok = ftp.completePendingCommand();
                    if(!ok)
                        throw new Exception("ERROR while sending the file");

PS: pb - это JProgressBar

...