Prefácio
Recentemente, preciso interagir com o servidor FTP no meu projeto. Encontrei uma aula de ferramentas sobre o FTP Upload and Download na Internet. Existem aproximadamente dois tipos.
O primeiro é uma classe de padrões de singleton.
O segundo tipo é definir outro serviço, que implementa diretamente o upload e o download do FTP através do serviço.
Ambos os sentimentos têm prós e contras.
O primeiro implementa a reutilização do código, mas as informações de configuração precisam ser escritas na classe, o que é mais complicado de manter.
O segundo tipo é uma estrutura de mola, as informações de configuração podem ser injetadas dinamicamente através do arquivo de propriedades, mas o código não pode ser reutilizado.
Por isso, pretendo implementar uma classe de ferramentas para integrar as duas vantagens acima. A propósito, alguns problemas comuns durante o processo de upload também foram resolvidos.
Como estou usando a estrutura da primavera, se a classe de ferramentas for declarada como feijão para a gerência da primavera, é um singleton por padrão, então não preciso implementar o singleton novamente. E por ser um feijão, posso injetar as propriedades do arquivo de propriedades nas propriedades do feijão para se afastar. A seguir, o código específico:
pacote com.cky.util; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.io.outputStream; importar org.apache.commons.nnet.ftpache.ftpache.pache.apache.apache.apache.commOns.nnet.ftpache.ftpache.apache.apache.apache.apache.commOns.nnet.ftppache; org.apache.commons.net.ftp.ftpfile; importar org.apache.commons.net.ftp.ftpreply; importar org.springframework.beans.factory.annotation.value; importenções de org.springFrame.teroType.comPonen; // Usando Spring automaticamente injeção de @value ("$ {ftp.host}") host private string; // ftp servidor ip @value ("$ {ftp.port}") private int porta; // FTP Server Port @Value ("$ {ftp.username}") private string nome de usuário; // nome de usuário @value ("$ {ftp.password}") private string senha; // senha @Value ("$ {ftp.basepath}) tester string basepath; // storma Método principal por trás do código/*public ftputil () {//system.out.println (this.toString ()); host = "192.168.100.77"; porta = 21; nome de usuário = "ftpuser"; senha = "ftp54321"; basepath = "/home/ftpuser/"; }*// **** @Param Path O caminho para fazer o upload do arquivo para o servidor* @param FileName Upload Nome do arquivo* @param Entrada de entrada Fluxo* @return*/ public boolean fileUpload (String Path, String filename, inputStream input) {ftpClient ftp = new ftpclient (); tente {ftp.connect (host, porta); ftp.login (nome de usuário, senha); // Defina o arquivo que codifica o formato ftp.setControlencoding ("UTF-8"); // Existem dois modos do cliente FTP Communication // Port (Modo Active) abre uma nova porta (> 1024) e envia comandos ou transmite dados através desta porta. Durante esse período, o servidor usa apenas uma porta que é aberta, como o cliente 21 // PASV (modo passivo) envia um comando PASV para o servidor, o servidor abre uma nova porta (> 1024) e usa essa porta para transmitir dados com a porta do cliente 21 // devido ao servidor e pelo servidor; // Defina o modo de transmissão no modo de fluxo ftp.setFileTransfermode (ftp.stream_transfer_mode); // Obtenha o código de status para determinar se a conexão é bem -sucedida se (! FtPreply.ispositiveCeliction (ftp.getReplyCode ())) {lança a nova RuntimeException ("FTP Server se recusa a se conectar"); } // Vá para o diretório raiz do arquivo carregado se (! } // julga se o diretório existe se (! Ftp.ChangeWorkingDirectory (Path)) {String [] dirs = path.split ("/"); // Crie o diretório para (String dir: dir) {if (null == Dir || "". Equals (dir)) continue; // julga se o diretório existe se (! } // Digite o diretório recém -criado ftp.ChangeWorkingDirectory (dir); }} // defina o tipo de arquivo carregado como tipo binário ftp.setFileType (ftp.binary_file_type); // Carregar o arquivo if (! Ftp.storefile (nome do arquivo, entrada)) {return false; } input.close (); ftp.logout (); retornar true; }} Catch (Exceção e) {lança nova RunTimeException (e); } finalmente {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioexception e) {lança nova runtimeException (e); }}} retorna false; } /** * * @param filename FileName, nota! O nome do arquivo aqui é o nome do arquivo Plus Path, como:/2015/06/04/aa.jpg * @param LocalPath Store no endereço local * @return */public boolean downloadfile (string filename, string localPath) {ftpclient ftp = new ftpclient (); tente {ftp.connect (host, porta); ftp.login (nome de usuário, senha); // Defina o arquivo que codifica o formato ftp.setControlencoding ("UTF-8"); // Existem dois modos de comunicação FTP // o cliente da porta (modo ativo) abre uma nova porta (> 1024) e envia comandos ou transmite dados através desta porta. Durante esse período, o servidor usa apenas uma porta que é aberta, como o cliente 21 // PASV (modo passivo) envia um comando PASV para o servidor, o servidor abre uma nova porta (> 1024) e usa essa porta para transmitir dados com a porta do cliente 21 // O servidor precisa abrir a porta do servidor porque o cliente é incontrolável, o Firewall etc. ftp.enterlocalPassivEMode (); // Defina o modo de transmissão no modo de fluxo ftp.setFileTransfermode (ftp.stream_transfer_mode); // Obtenha o código de status para determinar se a conexão é bem -sucedida se (! FtPreply.ispositiveCeliction (ftp.getReplyCode ())) {lança a nova RuntimeException ("FTP Server se recusa a se conectar"); } int index = filename.lastIndexof ("/"); // Obtenha o caminho do arquivo da sequência de arquivos = filename.substring (0, índice); // Obtenha o nome do arquivo string name = filename.substring (índice+1); // julgue se o diretório existe se (! } // Obtenha todos os arquivos neste diretório ftpfile [] arquivos = ftp.listfiles (); para (arquivo ftpfile: arquivos) {// julgue se existe um arquivo de destino //system.out.println(" filefile "+file.getName ()+" --- "+nome); if (file.getName (). Equals (name)) {//system.out.println("file encontrado "); // Se encontrado, copie o arquivo de destino para o arquivo local localfile = new File (Localath+"/"+file.getName ()); OutputStream Out = new FileOutputStream (LocalFile); ftp.retrievefile (file.getName (), out); out.Close (); }} ftp.logout (); retornar true; } catch (Exceção e) {lança nova RunTimeException (e); } finalmente {if (ftp.isconnected ()) {try {ftp.disconnect (); } catch (ioexception e) {lança nova runtimeException (e); }}}} // Se uma das duas funções for usada, o outro precisar teste-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- E.PrintStackTrace (); } finalmente {}*/// download teste------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Uso específico
Etapa 1: Configurar os arquivos da mola para carregar
ApplicationContext.xml
<Contexto: Propriedade-Placter Localização = "ClassPath:*.
Etapa 2: Declare a classe de ferramentas como um feijão
Método XML
<bean id = "ftputil"> <propriedade name = "host" value = "$ {ftp.host}"> </propriedade> <propriedade name = "port" value = "$ {ftp.port}"> </property> <propriedades name = "userName" value = "$ {ftp.username}"> value = "$ {ftp.password}"> </property> <propriedade name = "Basepath" value = "$ {ftp.basepath}"> </ouse> </i bean>Método de anotação, varredura de componentes
<Contexto: Componente-Scan Base-Package = "com.cky.util"> </context: component-scan>
Parte 3: injeção e uso
@AUTOWIRED PRIVADO FTPUTIL FtputIl;
Resumir
O acima exposto é um resumo das questões da ferramenta de upload e download do FTP da primavera introduzidas pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!