Prefacio
Recientemente, necesito interactuar con el servidor FTP en mi proyecto. Encontré una clase de herramientas sobre la carga y descarga FTP en Internet. Hay aproximadamente dos tipos.
El primero es una clase de patrón Singleton.
El segundo tipo es definir otro servicio, que implementa directamente la carga y descarga de FTP a través del servicio.
Ambos sentimientos tienen pros y contras.
El primero implementa la reutilización del código, pero la información de configuración debe escribirse en la clase, lo cual es más complicado de mantener.
El segundo tipo es un marco de Spring, la información de configuración se puede inyectar dinámicamente a través del archivo de propiedades, pero el código no puede reutilizarse.
Así que planeo implementar una clase de herramientas yo mismo para integrar las dos ventajas anteriores. Por cierto, algunos problemas comunes durante el proceso de carga también se han resuelto.
Debido a que estoy usando el marco de primavera, si la clase de herramientas se declara como Bean para la administración de primavera, es un singleton de forma predeterminada, por lo que no necesito implementar el singleton nuevamente. Y debido a que es un frijol, puedo inyectar las propiedades del archivo de propiedades en las propiedades del frijol para desacoplar. El siguiente es el código específico:
paquete com.cky.util; import java.io.file; import java.io.fileOutputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; importar org.apache.commons.net.ftp.ftp; importar org.apache.net.ftp.ftpclient; org.apache.commons.net.ftp.ftpfile; import org.apache.commons.net.ftp.ftpreply; import og.springframework.beans.factory.annotation.value; importar org.springframework.stereotype.component; // Usando el objeto Singleton automáticamente generador inyección de @Value ("$ {ftp.host}") host de cadena privada; // servidor ftp ip @Value ("$ {ftp.port}") private int puerto; // ftp puerto del servidor @Value ("$ {ftp.username}") privado cadena username; // username @value ("$ {ftp.password}") privado cadena contraseña; // contraseña @Value El método principal detrás del código/*public ftputil () {//system.out.println (this.ToString ()); host = "192.168.100.77"; puerto = 21; username = "ftpuser"; contraseña = "ftp54321"; basepath = "/home/ftpuser/"; }*// **** @param ruta La ruta para cargar el archivo en el servidor* @param FileName Nombre del archivo de carga* @param Ingrese de entrada transmisión* @return*/ public boolean fileUpload (string ruta, string fileName, inputStream Entrada) {ftpClient ftp = new ftpClient (); intente {ftp.connect (host, puerto); ftp.login (nombre de usuario, contraseña); // Establecer el formato de codificación de archivo ftp.setControlEncoding ("UTF-8"); // Hay dos modos de comunicación FTP // El cliente del puerto (modo activo) abre un nuevo puerto (> 1024) y envía comandos o transmite datos a través de este puerto. Durante este período, el servidor solo usa un puerto que abre, como el cliente 21 // Pasv (Modo Pasivo) envía un comando Pasv al servidor, el servidor abre un nuevo puerto (> 1024), y usa este puerto para transmitir datos con el puerto del cliente 21 // debido al cliente no controlable, el firewall, etc., el portero (el servidor y el Modo Passive. // Establezca el modo de transmisión en modo de transmisión ftp.setFilErtansferMode (ftp.stream_transfer_mode); // Obtenga el código de estado para determinar si la conexión es exitosa if (! Ftpreply.ispositiveCompletion (ftp.getReprepyCode ())) {Throw New RuntimeException ("El servidor FTP se niega a conectarse"); } // vaya al directorio raíz del archivo cargado if (! Ftp.changeworkingDirectory (basepath)) {throw new runtimeException ("El directorio raíz no existe, debe crearse"); } // juzga si el directorio existe si (! Ftp.changeworkingDirectory (ruta)) {string [] dirs = path.split ("/"); // Crear el directorio para (String Dir: Dirs) {if (null == Dir || "". Equals (dir)) Continuar; // juzga si el directorio existe si (! Ftp.changeworkingDirectory (dir)) {// crea if (! Ftp.makedirectory (dir)) {throw new runtimeException ("Subdirectory Creation falló"); } // Ingrese el directorio recién creado ftp.changeworkingDirectory (dir); }} // Establezca el tipo de archivo cargado en el tipo binario ftp.setFileType (ftp.binary_file_type); // cargar el archivo if (! Ftp.storeFile (nombre de archivo, input)) {return false; } input.close (); ftp.logout (); devolver verdadero; }} Catch (Exception e) {Throw New RuntimeException (e); } finalmente {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {Throw New RuntimeException (e); }}} return false; } /** * * @param nombre de archivo de archivo, ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ El nombre del archivo aquí es la ruta del nombre del archivo Plus, como: /2015/06/04/aa.jpg * @param store localpath en la dirección local * @return */public boolean descargarfile (string filename, string localpath) {ftpClient ftp = new ftpClient (); intente {ftp.connect (host, puerto); ftp.login (nombre de usuario, contraseña); // Establecer el formato de codificación de archivo ftp.setControlEncoding ("UTF-8"); // Hay dos modos de comunicación FTP // El cliente del puerto (modo activo) abre un nuevo puerto (> 1024) y envía comandos o transmite datos a través de este puerto. Durante este período, el servidor solo usa un puerto que abre, como el cliente 21 // Pasv (Modo Pasivo) envía un comando Pasv al servidor, el servidor abre un nuevo puerto (> 1024), y usa este puerto para transmitir datos con el puerto del cliente 21 // El servidor necesita abrir el puerto del servidor porque el cliente no es controlable, firewall, etc., así ftp.enterlocalpassivemode (); // Establezca el modo de transmisión en modo de transmisión ftp.setFilErtansferMode (ftp.stream_transfer_mode); // Obtenga el código de estado para determinar si la conexión es exitosa if (! Ftpreply.ispositiveCompletion (ftp.getReprepyCode ())) {Throw New RuntimeException ("El servidor FTP se niega a conectarse"); } int index = filename.lastIndexOf ("/"); // Obtener la ruta de la string de archivo Path = FileName.Substring (0, índice); // Obtenga el nombre del nombre del archivo Nombre = FileName.Substring (índice+1); // juzga si el directorio existe si (! Ftp.changeworkingDirectory (basepath+ruta)) {Throw New RuntimeException ("La ruta del archivo no existe:"+BasePath+Path); } // Obtenga todos los archivos en este directorio ftpfile [] archivos = ftp.listfiles (); para (archivo ftpfile: archivos) {// juzga si hay un archivo de destino //system.out.println("File name "+file.getName ()+" --- "+nombre); if (file.getName (). Equals (name)) {//system.out.println("ile encontrado "); // Si se encuentra, copie el archivo de destino en el archivo local localfile = nuevo archivo (localpath+"/"+file.getName ()); OutputStream out = new FileOutputStream (LocalFile); ftp.retrieveFile (file.getName (), out); out.close (); }} ftp.logout (); devolver verdadero; } catch (Exception e) {Throw New RuntimeException (e); } finalmente {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioException e) {Throw New RuntimeException (e); }}}} // Si se usa una de las dos funciones, la otra debe comentarse en public static void main (string [] args) {// cargar prueba-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- E.PrintStackTrace (); } finalmente {}*/// descargar prueba------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -----------------------------------------------------------------------------------------------Uso específico
Paso 1: Configurar los archivos de Spring para cargar Propiedades
ApplicationContext.xml
<context: Property-placeHolder ubicación = "classpath:*. propiedades"/> ftp.propertiesftp.host = 192.168.100.77ftp.port = 21ftp.username = ftpuserftp.password = ftp54321ftp.basepath =/home/ftpuser//
Paso 2: Declare la clase de herramientas como un frijol
método XML
<bean id = "ftputil"> <propiedad name = "host" value = "$ {ftp.host}"> </property <propiedad name = "port" value = "$ {ftp.port}"> </property> <Property name = "username" value = "$ {ftp.username}"> </propiedad de la propiedad = "contraseña" value = "$ {ftp.password}"> </property> <propiedad name = "basePath" value = "$ {ftp.basepath}"> </property> </bean>Método de anotación, escaneo de componentes
<context: componente-scan base-paquete = "com.cky.util"> </context: component-scan>
Parte 3: inyección y uso
@AUTOWIREDIRED Private ftputil ftputil;
Resumir
Lo anterior es un resumen de los problemas de la herramienta de carga y descarga de Spring FTP introducidos por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!