Загрузка файла с FTP-сервера на Java
Использование Apache Commons Net API, легко написать программу для загрузки файла с FTP-сервера. В этой статье вы узнаете, как правильно реализовать java-код для загрузки файлов с сервера по протоколу FTP.
Apache Commons Net API и FTP
Класс org.apache.commons.net.ftp.FTPClient предоставляет два метода загрузки файлов с FTP-сервера:
1) boolean retrieveFile(String remote, OutputStream local): Этот метод извлекает файл с сервера, указывая путь к нему в параметре remote и записывает полученные байты, используя OutputStream. Этот метод возвращает true в случае успеха, в противном случае false. Этот способ подходит с нашей программой, когда вам не нужно знать информацию о передаче и о том, как файл сохраняется на диск. В конце загрузки мы должны закрыть выходной поток OutputStream в конце загрузки.
2) InputStream retrieveFileStream(String remote): Этот метод принимает в качестве параметра только путь к удаленному файлу и не требует OutputStream, но возвращает InputStream который может быть полезен для чтения байтов, полученных из файла. Этот метод дает нам больше контроля над тем, как байты записываются на локальный диск. Есть два важных момента, связанных с использованием этого метода:
- Метод completePendingCommand() должен быть вызван для завершения загрузки и проверки возвращенного значения, чтобы убедиться, что загрузка состоялась.
- Поток воспроизведения должен быть закрыт InputStream.
Вопрос в том, какой метод следует использовать? Вот несколько хитростей:
- Первый способ — это самый простой способ загрузить удаленный файл, передав аргумент OutputStream файла, который мы хотим сохранить на диск.
- Второй метод дает нам больше контроля над тем, как выполняется передача, поэтому он требует больше кода для написания путем создания InputStream для чтения полученных байтов и OutputStream , чтобы сохранить прочитанные байты. Этот метод полезен, если вы хотите узнать, сколько байтов было передано и сколько осталось. Метод completePendingCommand() должен быть вызван для завершения загрузки.
- Оба метода вызывают исключение IOException или один из этих двух исключения: FTPConnectionClosedExcception и CopyStreamException. Поэтому убедитесь, что вы правильно обрабатываете эти исключения при вызове .
Кроме того, следующие два метода должны быть вызваны перед methods retrieveFile() и retrieveFileStream():
- void enterLocalPassiveMode(): Этот метод изменяет режим соединения с сервера-клиента на клиент-сервер, что позволяет избежать проблемы блокировки брандмауэра.
- void setFileType(int fileType): этот метод изменяет тип передаваемого файла, рекомендуется изменить тип на FTP. BINARY_FILE_TYPE, а не FTP. ASCII_FILE_TYPE даже если это текстовый файл.
Шаги по загрузке файла в Java
Ниже приведены шаги по правильной реализации кода загрузки удаленного файла с FTP-сервера с помощью Apache Commons Net:
- Подключиться и авторизоваться на сервере.
- Использовать пассивный режим подключения.
- Изменить тип передачи на binary.
- Создать outputStream для сохранения загруженного файла на диск.
- Укажите путь записи на disk.
- Если вы используете метод retriveFile():
- Pass outputStream и путь к файлу в качестве аргументов.
- Close Write Stream outputStream.
- Прочтите возвращенное значение, чтобы проверить, была ли загрузка успешной.
- Если вы используете метод retriveFileStream():
- Retrieve On InputStream Возвращается методом retriveFileStream().
- Создать массив байтов (буфер) заданного размера (обычно 4096) для чтения байтов и их записи с помощью a outputStream.
- Вызов метода completePendingCommand() для завершения загрузки и проверки возвращенного значения, чтобы убедиться, что передача прошла успешно.
- Закрыть потоки чтения и записи InputStream и outputStream.
- Отключиться от сервера с помощью disconnect().
Программа для загрузки файла с FTP на Java
В этом коде показано, как скачать файл с FTP-сервера с помощью этих двух методов:- boolean retrieveFile(String remote, InputStream local)
- inputStream retrieveFileStream(String remote)
import java.io.BufferedOutputStream;Выполнение этого кода означает, что загрузка прошла успешно:
импорт java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
public class FTPDownloadFile {
public static void main(String[] args) {
server string = "ServerAddress";
int порт = 21;
String username = "YourUserName";
String password = "yourPassword";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(имя пользователя, пароль);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP. BINARY_FILE_TYPE);
// Подход 1: Загрузка файла с помощью InputStream
File file = new File("plugins and styles.txt");
String FileName = "плагины и styles.txt";
InputStream inputStream = new FileInputStream(файл);
System.out.println("Начать загрузку");
//download result
boolean res = ftpClient.storeFile(filename, inputStream);
//закрываем поток воспроизведения
inputStream.close();
if (res==true) {
System.out.println("Файл "+FileName+
" был успешно загружен");
}
// Подход 2: Загрузка файла с помощью OutputStream
String FileName2 = "Track 2.mp3";
строка RemoteFilePath = "/songs/"+FileName2;
File filelocal = new File("C:/Track 2.mp3");
// выводим папку, в которой находится файл, и
// затем ищем его по имени для получения
// его размер, который будет использоваться для вычисления
// соотношение загрузки
FTPFile[] files1 = ftpClient.listFiles("/songs");
long size = 0;
for(int i = 0; Я< файлы1.длина; i++){
if(files1[i].getName().equals(FileName2))
//получаем размер файла
size = files1[i].getSize();
}
OutputStream outputStream2 = new BufferedOutputStream(
new FileOutputStream(локальный файл));
InputStream inputStream2 = ftpClient.retrieveFileStream(
RemoteFilePath);
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
//до тех пор, пока мы не дойдем до конца
int передан = 0;
int процент = 0;
while ((bytesRead = inputStream2.read(bytesArray)) != -1) {
//байты записываются в указанное место
outputStream2.write(bytesArray, 0, bytesRead);
переслал += bytesRead;
процентов = (int) (передано*100/размер);
System.out.println(percentage+"%");
}
//close write read streams
inputStream2.close();
outputStream2.close();
//br //
res = ftpClient.completePendingCommand();
if (res) {
System.out.println("Файл "+FileName2+
" был успешно загружен");
}
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} наконец {
try {
if (ftpClient.isConnected()) {
//закрываем FTP
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Start download
Плагины и styles.txt файл успешно загружены
Start download
1%
2%
3%
.
.
98%
99%
99%
100%
2.mp3 Файл трека успешно загружен