Загрузка файлов на FTP-сервер с помощью Java
Для написания Java-кода, который загружает файлы с локального диска на онлайн-FTP-сервер, Apache Commons Net API является очень хорошим выбором для Java-разработчиков. Это просто и облегчает программирование с помощью FTP.
Этот код показывает, как отправить файлы с машины на FTP-сервер с помощью этих двух методов:
1- Загрузите Apache Commons Net
API загрузить Apache Commons Net API который содержит набор сетевых инструментов и поддерживает несколько протоколов, таких как: FTP, Telnet, SMTP... После загрузки файл .jar должен быть встроен в classpath.
2- Apache Commons Net API для передачи файлов по протоколу FTP
Класс FTPClient предоставляет методы для передачи локального файла на онлайн-сервер по протоколу FTP:- boolean storeFile(String remote, InputStream local)
- OutputStream storeFileStream(String remote)
- boolean storeUniqueFile(InputStream local)
- boolean storeUniqueFile(String remote, InputStream local)
- OutputStream storeUniqueFileStream()
- OutputStream storeUniqueFileStream(String remote)
- Храните файлы, указав a InputStream локального файла (это методы, которые имеют a InputStream в качестве параметра). Этот тип методов применяется, когда вам не нужно знать, как это сделать. в байты передаются из локального файла на сервер. Мы позволяем системе делать это. processing.
- Храните файлы, записывая в OutputStream соединения (это методы, которые имеют OutputStream в качестве выходных данных). Эти типы методов необходимы, если вы хотите контролировать использование байтов. являются forwarded, написав наш собственный код для чтения байт через локальный файл, который будет сохранен в пути к удаленному файлу через объект OutputStream. Это может быть полезно, если вы хотите показать Прогресс  загрузки, вычисляя, сколько байт передается по размеру файла .
- Четко назовите удаленный файл (Те методы, которые принимают параметр String с именем remote).
- Оставьте имена серверов и удаленного файла с уникальным именем (Эти методы, у которых нет параметра String).
Несмотря на сложность этих методов, На практике в основном используются только два метода:
- boolean storeFile(String remote,InputStream local)
- OutputStream storeFileStream(String remote)
Помимо этих шести методов, есть еще два метода, которые необходимо вызывать до и после загрузки файла:
- boolean setFileType(int fileType): Определяет тип файла, т.е. FTP. ASCII_FILE_TYPE или FTP. BINARY_FILE_TYPE, используется для передачи файла. Тип по умолчанию — ASCII (обычный текст), но он должен быть двоичным, чтобы он работал со всеми файлами. Этот метод должен быть вызван до начала передачи файла.
- boolean completePendingCommand(): Этот метод должен быть вызван после завершения загрузки для завершения транзакции. Она возвращается true Если перевод завершен успешно, если нет; false. Возвращаемое значение этого метода должно быть проверено, чтобы убедиться, что загрузка состоялась.
По умолчанию FTP устанавливает соединение, открывая порт для клиента, и позволяет серверу подключаться к этому порту. Это активный режим, но иногда он блокируется брандмауэром и передача файлов не работает. К счастью, протокол FTP имеет еще один режим, который является пассивным режимом, в котором устанавливается соединение, путем открытия порта на сервере для подключения клиента. Этот режим не блокируется firewall.
Поэтому рекомендуется переключаться в пассивный режим перед началом передачи данных вызовом метода класса FTPClient enterLocalPassiveMode().
3- Шаги по передаче файла в Java
Чтобы правильно написать код для передачи файла на FTP-сервер с помощью Apache Commons Net API, необходимо выполнить следующие шаги:
- InputStream для локального файла.
- Вызовите один из методов магазин... () чтобы начать передачу файла. Существует два сценария:
- Использование InputStream: Это самый простой способ, так как вы позволяете системе позаботиться об отправке и получении. Никакого дополнительного кода нет, просто передайте элемент InputStream в соответствующем методе, например, в методе storeFile(String remote, InputStream local).
- Using OutputStream: это более сложная задача, но вы получаете больший контроль над передаваемыми данными. В общем, нужно написать несколько строк кода для чтения байтов из InputStream локального файла и запишите эти байты в OutputStream который возвращается функцией Метод хранения... (), например, storeFileStream(String remote).
- Close Data Streams InputStream et OutputStream.
- Вызов метода completePendingCommand() для завершения транзакции.
- Отключиться от сервера.
Значение возвращаемого метода магазин... () и completePendingCommand() чтобы убедиться, что загрузка завершена.
4- Java
- boolean storeFile(String remote, InputStream local)
- OutputStream storeFileStream(String remote)
import java.io.File;Выполнение этого кода возвращает информацию о том, что передача прошла успешно:
import java.io.FileInputStream;
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;
public class FTPUploadFile {
public static void main(String[] args) {
server string = "ServerAddress";
int порт = 21;
Строка user = "username";
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("C:/plugins and styles.txt");
String path = "plugins and styles.txt";
InputStream inputStream = new FileInputStream(файл);
System.out.println("Начать загрузку");
//вывод upload
boolean res = ftpClient.storeFile(path, inputStream);
//закрывает поток чтения
inputStream.close();
if (res==true) {
System.out.println("Файл "+path+" был успешно загружен");
}
// Подход 2: Загрузка файла с помощью OutputStream
file = new File("C:/track 1.wma");
path = "аудио/дорожка 1.wma";
inputStream = new FileInputStream(файл);
System.out.println("Начать загрузку");
OutputStream outputStream = ftpClient.storeFileStream(path);
byte[] bytesIn = новый байт[4096];
int buffer = 0;
//до тех пор, пока мы не дойдем до конца файла
System.out.println("Загрузка...");
int передано = 0;
int процент = 0;
//до тех пор, пока мы не дошли до конца файла
while ((buffer = inputStream.read(bytesIn)) != -1) {
//читаем данные с буфером 4096 bytes
outputStream.write(bytesIn, 0, buffer);
передан += буфер;
percent = (int) (transferred*100/file.length());
System.out.println(percentage+"%");
}
//close write read streams
inputStream.close();
outputStream.close();
//загружаем result
res = ftpClient.completePendingCommand();
if (res) {
System.out.println("Файл "+path+" был успешно загружен");
}
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} наконец {
try {
if (ftpClient.isConnected()) {
//закрываем FTP
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Начало загрузки
Плагины и styles.txt файл успешно загружены
Начало загрузки
1%
2%
3%
.
.
97%
98%
98%
99%
99%
100%
Файл трека 1.wma был успешно загружен