Предисловие
Недавно мне нужно взаимодействовать с FTP -сервером в моем проекте. Я нашел класс инструментов о загрузке и загрузке FTP в Интернете. Есть примерно два типа.
Первый - это односложенный узор.
Второй тип - определить другую службу, которая напрямую реализует загрузку и загрузку FTP через сервис.
Оба эти чувства имеют плюсы и минусы.
Первый из них реализует повторное использование кода, но информация о конфигурации должна быть записана в классе, что сложнее поддерживать.
Второй тип представляет собой пружинную структуру, информация о конфигурации может быть динамически внедрена через файл свойств, но код не может быть использован повторно.
Поэтому я сам планирую внедрить класс инструментов, чтобы интегрировать два вышеупомянутых преимущества. Кстати, некоторые распространенные проблемы во время процесса загрузки также были решены.
Поскольку я использую Spring Framework, если класс инструментов объявляется Bean для управления весной, это Singleton по умолчанию, поэтому мне не нужно снова реализовать Singleton. А поскольку это боб, я могу внедрить свойства файла свойств в свойства боба для департамента. Ниже приведен конкретный код:
пакет com.cky.util; импорт java.io.file; import java.io.fileoutputstream; импорт java.io.ioexception; import java.io.inputStream; import java.io.outputStream; import org.apache.commons.net.ftp.ftp; import org.apache.commons.net.ftp.ftpcl org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;//using spring automatically generates singleton object, //@Componentpublic class FtpUtil { //automatic injection of @Value ("$ {ftp.host}") частный строковый хост; // FTP -сервер IP @Value ("$ {ftp.port}") private int port; // порт сервера FTP @value ("$ {ftp.username}") private String username; // username @value ("$ {ftp.password}") Private String Password; // пароль @value ("$ {ftp.basepath}") в основном методе, стоящем за кодом/*public ftputil () {//system.out.println (this.tostring ()); host = "192.168.100.77"; порт = 21; username = "ftpuser"; пароль = "ftp54321"; basePath = "/home/ftpuser/"; }*// **** @param path Путь к загрузке файла на сервер* @param fileName Имя файла файла* @param Input Входной поток* @return*/ public boolean fileUpload (String Path, String Filename, InputStream Input) {ftpClient ftp = new ftpClient (); try {ftp.connect (host, port); ftp.login (имя пользователя, пароль); // Установить формат кодирования файла ftp.setControLeNcoding ("UTF-8"); // Существует два режима клиента FTP Communication // Port (Active Mode) открывает новый порт (> 1024) и отправляет команды или передает данные через этот порт. В течение этого периода сервер использует только один порт, который он открывает, например, 21 // клиент PASV (пассивный режим) отправляет команду PASV на сервер, сервер открывает новый порт (> 1024) и использует этот порт для передачи данных с портом клиента 21 // из -за неконтролируемого клиента, FireWally и т. Д., Порт должен быть открыт с помощью сервера и пассивного режира // Установить режим передачи в режим потока FTP.SetFileTransFermode (ftp.stream_transfer_mode); // Получить код состояния, чтобы определить, является ли подключение успешным, если (! FtpReply.ispositivecoplution (ftp.getReplyCode ())) {Throw New RuntimeException («FTP -сервер отказывается подключаться»); } // Перейдите в корневой каталог загруженного файла if (! Ftp.changeWorkingDirectory (basePath)) {бросить новое Runtimeexception («корневой каталог не существует, необходимо создать»); } // Судить, существует ли каталог if (! Ftp.ChangeWorkingDirectory (path)) {String [] dirs = path.split ("/"); // Создать каталог для (строка Dir: dirs) {if (null == dir || ".. Equals (dir)) продолжить; // Судите, существует ли каталог if (! Ftp.ChangeWorkingDirectory (dir)) {// create if (! Ftp.madkedirectory (dir)) {бросить новое runtimeexception ("Создание подзадачи не удалось"); } // Введите недавно созданный каталог ftp.changeworkingDirectory (dir); }} // Установите загруженный тип файла на двоичный тип ftp.setFileType (ftp.binary_file_type); // загружать файл if (! Ftp.storefile (filename, input)) {return false; } input.close (); ftp.logout (); вернуть истину; }} catch (Exception e) {бросить новое runtimeexception (e); } наконец {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {бросить новое runtimeexception (e); }}} вернуть false; } /** * * * @param filename filename, примечание! Имя файла здесь - это имя файла плюс, например: /2015/06/04/aa.jpg * @param localpath Store на локальном адресе * @return */public boolean downloadfile (String FileName, String LocalPath) {ftpClient ftp = new ftpClient (); try {ftp.connect (host, port); ftp.login (имя пользователя, пароль); // Установить формат кодирования файла ftp.setControLeNcoding ("UTF-8"); // Существует два режима связи FTP // Клиент порта (Active Mode) открывает новый порт (> 1024) и отправляет команды или передает данные через этот порт. В течение этого периода сервер использует только один порт, который он открывает, например, 21 // клиент PASV (пассивный режим) отправляет команду PASV на сервер, сервер открывает новый порт (> 1024) и использует этот порт для передачи данных с помощью порта клиента 21 // Сервер, чтобы открыть порт, потому что клиент не является режим, и т. Д., Сервер, чтобы открыть порт, а также для открытия порта, а также для открытия порта, и для открытия порта, а также для открытия порта, и для открытия порта, и для открытия порта, а также для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия порта, и для открытия. ftp.enterlocalpassivemode (); // Установить режим передачи в режим потока FTP.SetFileTransFermode (ftp.stream_transfer_mode); // Получить код состояния, чтобы определить, является ли подключение успешным, если (! FtpReply.ispositivecoplution (ftp.getReplyCode ())) {Throw New RuntimeException («FTP -сервер отказывается подключаться»); } int index = filename.lastIndexof ("/"); // Получить путь из строки файла path = filename.substring (0, index); // Получить имя файла string name = filename.substring (index+1); // Судить, существует ли каталог, если (! Ftp.ChangeWorkingDirectory (basePath+path)) {бросить новое runtimeexception («Путь файла не существует:»+basepath+path); } // Получить все файлы в этом каталоге ftpfile [] files = ftp.listfiles (); для (ftpfile file: files) {// Существует, есть ли целевой файл //system.out.println("file name "+file.getName ()+" --- "+name); if (file.getName (). equals (name)) {//system.out.println("file найдено "); // Если найдено, скопируйте целевой файл в локальный файл localfile = new File (localPath+"/"+file.getName ()); OutputStream out = new FileOutputStream (LocalFile); ftp.retrievefile (file.getName (), out); out.close (); }} ftp.logout (); вернуть истину; } catch (Exception e) {бросить новое runtimeexception (e); } наконец {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {бросить новое runtimeexception (e); }}}} // Если используется одна из двух функций, другая должна быть прокомментирована в общественной статической void main (string [] args) {// upload тест-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- e.printstacktrace (); } наконец {}*/// Скачать тест------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Конкретное использование
Шаг 1: Настройка Spring для загрузки файлов свойств
ApplicationContext.xml
<Контекст: Property Placeholder location = "classpath:*. Properties"/> ftp.propertiesftp.host = 192.168.100.77ftp.port = 21ftp.username = ftpuserftp.password = ftp54321ftp.basepath =/ftpuser/
Шаг 2: объявить класс инструментов как боб
метод XML
<bean id = "ftputil"> <property name = "host" value = "$ {ftp.host}"> </property> <name = "port" value = "$ {ftp.port}"> </property> <name = "username" value = "$ {ftp.username}"> </property> <pertive name " value = "$ {ftp.password}"> </property> <property name = "basePath" value = "$ {ftp.basepath}"> </property> </bean>Метод аннотации, сканирование компонентов
<Контекст: компонент-сканирование base-package = "com.cky.util"> </context: component-scan>
Часть 3: Инъекция и использование
@Autowired private ftputil ftputil;
Суммировать
Выше приведено краткое изложение проблем с загрузкой и загрузкой FTP FTP, представленными редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!