Загрузка файлов на FTP-сервер с помощью Java

Для написания Java-кода, который загружает файлы с локального диска на онлайн-FTP-сервер, Apache Commons Net API является очень хорошим выбором для Java-разработчиков. Это просто и облегчает программирование с помощью 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

    Этот код показывает, как отправить файлы с машины на FTP-сервер с помощью этих двух методов:
    • boolean storeFile(String remote, InputStream local)
    • OutputStream storeFileStream(String remote)
    После вызова storeFile(), вызов completePendingCommand(). Вот полный код:

    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 был успешно загружен