Este artigo compartilhou com você duas maneiras de fazer upload e baixar arquivos Java FTP para sua referência. O conteúdo específico é o seguinte
O primeiro método:
package com.cloudpower.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import sun.net.TelnetInputStream;import sun.net.TelnetOutputStream;import sun.net.ftp.FtpClient;/** * Java's own API operation on Ftp* @title: ftp.java* @author: zhou lingbin*/public class ftp {/*** nome do arquivo local*/private string localFileName; / *** Nome do arquivo remoto*/ String private RemoteFileName; / *** cliente ftp*/ private ftpClient ftpClient; /***Conexão do servidor*@param IP IP*@param Porta Porta Porta do servidor*@param Nome do usuário do usuário*@param Senha senha*@Param Path Path*@author zhou lingbin*@date 2012-7-11*/public void ConnectServer (string IP, porta, string user, senha de string, string path) {tentativa {/******** método // ftpClient = new ftpClient (); // ftpclient.openserver (ip, porta); // o segundo método ftpClient = new ftpClient (IP); ftpClient.login (usuário, senha); // defina como transmissão binária ftpclient.binary (); System.out.println ("Sucesso de login!"); if (path.Length ()! = 0) {// Alterne o diretório no sistema remoto para o diretório especificado pelo caminho do parâmetro ftpclient.cd (caminho); } ftpClient.binary (); } catch (ioexception ex) {ex.printStackTrace (); lançar a nova RuntimeTimeException (EX); }} / *** Feche a conexão* @author zhou lingbin* @date 2012-7-11* / public void closeconnect () {try {ftpClient.ClosServer (); System.out.println ("Desconectar sucesso"); } catch (ioexception ex) {System.out.println ("não desconectando"); Ex.PrintStackTrace (); lançar a nova RuntimeTimeException (EX); }} / *** Arquivo de upload* @Param LocalFile Local File* @Param RemoteFile Remote Argh* @Author Zhou lingbin* @Date 2012-7-11* / public void upload (String LocalFile, String RemoteFile) {this.LocalFilename = LocalFile; this.RemoteFilename = RemoteFile; TelnetOutputStream OS = null; FileInputStream é = null; tente {// Adicione o arquivo remoto ao fluxo de saída OS = ftpClient.put (this.RemoteFileName); // Obtenha o fluxo de entrada do arquivo local arquivo file_in = novo arquivo (this.localfilename); is = new FileInputStream (file_in); // Crie um byte buffer [] bytes = novo byte [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Upload Success"); } catch (ioexception ex) {System.out.println ("não upload"); Ex.PrintStackTrace (); lançar a nova RuntimeTimeException (EX); } finalmente {tente {if (is! = null) {is.close (); }} catch (ioexception e) {e.printStackTrace (); } finalmente {tente {if (os! = null) {os.close (); }} catch (ioexception e) {e.printStackTrace (); }}}} / ** * Faça o download do arquivo * @Param RemoteFile Remote File Path (lado do servidor) * @Param LocalFile Local File Path (Client) * @author zhou lingbin * @date 2012-7-11 * / public void Download (String RemoteFile, String LocalFile) {telNetinTream Is = Null; FileOutputStream OS = null; tente {// Obtenha o nome do arquivo na máquina remota e use o telNetInputStream para transferir o arquivo para a área local. é = ftpClient.get (remotefile); Arquivo file_in = novo arquivo (LocalFile); OS = new FileOutputStream (file_in); byte [] bytes = novo byte [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Download Success"); } catch (ioexception ex) {System.out.println ("não download"); Ex.PrintStackTrace (); lançar a nova RuntimeTimeException (EX); } finalmente {tente {if (is! = null) {is.close (); }} catch (ioexception e) {e.printStackTrace (); } finalmente {tente {if (os! = null) {os.close (); }} catch (ioexception e) {e.printStackTrace (); }}}} public static void main (string agrs []) {string filepath [] = {"/temp/aa.txt", "/temp/regist.log"}; String localFilePath [] = {"c: //tmp//1.txt", "c: //tmp//2.log"}; Ftp fu = new ftp (); /** Use o número da porta padrão, nome de usuário, senha e diretório root para se conectar ao servidor FTP*/fu.connectServer ("127.0.0.1", 22, "anonymous", "ieuser@", "/temp"); // download para (int i = 0; i <filepath.length; i ++) {fu.download (filepath [i], localFilePath [i]); } String localfile = "e: //number.txt"; String remotefile = "/temp/haha.txt"; // upload fu.upload (LocalFile, RemoteFile); fu.closeConnect (); }}
Não há nada a dizer sobre esse método, é relativamente simples, e não há problema em um código ilegal chinês. Parece que há uma falha e não pode operar arquivos grandes. Amigos interessados podem experimentar.
O segundo método:
classe pública ftpapche {private static ftpClient ftpClient = new ftpClient (); codificação de string estática privada = system.getProperty ("file.encoding"); /** * Descrição: Faça o upload do arquivo para o servidor FTP * * @versão1.0 * @param url * ftp servidor hostName * @param porta * porta ftp servidor * @param nome de usuário * ftp login conta * @param senha FTP Server * @Param Input * Fluxo de entrada de arquivo local * @return Retorne true com sucesso, caso contrário, false */ public estático boolean uploadFile (URL da String, Int Port, String UserName, String Senha, String Path, String FileName, InputStream Input) {Boolean Result = False; tente {int Responder; // Se a porta padrão for usada, você poderá se conectar diretamente ao servidor FTP ftpClient.Connect (URL); // ftp.connect (url, porta); // conecta -se ao servidor FTP // efetuar login no ftpclient.login (nome de usuário, senha); ftpClient.SetControlEncoding (codificação); // Verifique se a conexão é bem -sucedida resposta = ftpClient.getReplyCode (); if (! ftpreply.ispositiveciction (resposta)) {System.out.println ("Falha na conexão"); ftpClient.disconnect (); resultado de retorno; } // Transfira o diretório de trabalho para o diretório especificado, alteração booleana = ftpclient.ChangeWorkingDirectory (caminho); ftpClient.SetFileType (ftp.binary_file_type); if (alteração) {resultado = ftpclient.storefile (new String (filename.getBytes (codificação), "ISO-8859-1"), entrada); if (resultado) {System.out.println ("Carregado com sucesso!"); }} input.close (); ftpClient.logout (); } catch (ioexception e) {e.printStackTrace (); } finalmente {if (ftpClient.isconnected ()) {try {ftpclient.disconnect (); } catch (ioexception iOe) {}}} Retornar resultado; }/*** Carregue arquivos locais para o servidor FTP**/public void testUploadFromDisk () {try {FileInputStream in = new FileInputStream (novo File ("e: /number.txt"); sinalizador booleano = uploadfile ("127.0.0.1", 21, "zlb", "123", "/", "haha.txt", in); System.out.println (sinalizador); } catch (filenotfoundException e) {e.printStackTrace (); }} /** * Descrição: Faça o download do arquivo do servidor FTP * * @versão1.0 * @param url * ftp servidor hostname * @param porta * porta ftp servidor * @param userName * ftp BEATION Conta * @param senha * ftp Login senha * REMOTEPATH * Local após o download * @return */ public estático boolean DownFile (URL da String, Int Port, String Username, String Senha, String Remotepath, String filename, String Localath) {resultado booleano = false; tente {int Responder; ftpClient.SetControlEncoding (codificação); / * * Para fazer upload e baixar arquivos chineses, alguns lugares recomendam o uso das duas frases a seguir em vez de * new String (remotepath.getbytes (codificação), "ISO-8859-1") transcodificando. * Após o teste, ele não pode ser passado. */// ftpclientConfig conf = new ftpClientConfig (ftpclientConfig.syst_nt); // conf.setsserverlanguageCode ("zh"); ftpClient.Connect (URL, porta); // Se a porta padrão for usada, você poderá se conectar diretamente ao servidor FTP por ftpclient.login (nome de usuário, senha); // login // Defina o tipo de transferência de arquivo para binário ftpclient.setFileType (ftpclient.binary_file_type); // Obtenha o código de resposta do login FTP Responder = ftpClient.getReplyCode (); // Verifique se o login é bem -sucedido se (! FtPreply.ispositivecicling (resposta)) {ftpclient.disconnect (); System.err.println ("FTP Server Recused Connection."); resultado de retorno; } // Transfira para o diretório do servidor FTP para o diretório especificado ftpclient.ChangeWorkingDirectory (new String (remotepath.getbytes (codificação), "ISO-8859-1"); // Obtenha a lista de arquivos ftpfile [] fs = ftpClient.listfiles (); para (ftpfile ff: fs) {if (ff.getName (). Equals (FileName)) {arquivo localfile = new File (localPath + "/" + ff.getName ()); OutputStream is = new FileOutputStream (LocalFile); ftpClient.retrievefile (ff.getName (), IS); is.close (); }} ftpClient.logout (); resultado = true; } catch (ioexception e) {e.printStackTrace (); } finalmente {if (ftpClient.isconnected ()) {try {ftpclient.disconnect (); } catch (ioexception iOe) {}}} Retornar resultado; }/** * Faça o download do arquivo no servidor FTP para o local * */public void testdownfile () {try {bandeira booleana = DownFile ("127.0.1", 21, "zlb", "123", "/", "haha.txt", d:/"); System.out.println (sinalizador); } catch (Exceção e) {e.printStackTrace (); }} public static void main (string [] args) {ftpapche fa = new ftpapche (); fa.testdownfile (); }}
Dessa forma, você precisa prestar atenção ao problema do código ilegal chinês. Se você defini -lo incorretamente, o nome do arquivo carregado poderá ser um código contornado. Às vezes, não pode ser carregado. Obviamente, você não o levará porque não há exceção. Eu encontrei muitas soluções on -line e há muitas opiniões diferentes. Quase todos eles foram copiados de uma versão, e eu não fui testado por mim mesmo. Eu sofri muito por isso. É dividido aproximadamente nas duas soluções a seguir:
1. Adicione as três frases a seguir para resolvê -lo
ftpClient.SetControlEncoding ("GBK");
FtpClientConfig conf = new ftpClientConfig (ftpClientConfig.syst_nt);
conf.SetServerLanguageCode ("ZH");
Resposta: Após o teste, simplesmente não funciona, o problema acima ainda existe
2. É semelhante ao método acima, mas acho que esse método é mais confiável
Primeiro, adicione a frase ftpclient.setControlencoding ("GBK"); E então, transcoda todos os chineses no formato "ISO-8859-1", como segue:
ftpClient.ChangeWorkingDirectory (new String (remotepath.getbytes ("GBK"), "ISO-8859-1"));
Resposta: Após o teste, ainda não funciona. A razão pela qual eu disse que esse método é mais confiável. Por favor, continue lendo.
Primeiro, vamos falar sobre por que precisamos transcodificar:
Como no protocolo FTP, o nome do arquivo é especificado para ser codificado como ISO-8859-1, o nome do diretório ou o nome do arquivo precisa ser transcodificado.
A próxima pergunta é: que codificação devemos converter para este formato. Portanto, há uma segunda solução-convertendo o formato GBK em formato ISO-8859-1. Além disso, algumas pessoas também dizem que isso deve ser feito. Na verdade, acho que a razão pela qual eles podem dizer que isso é uma completa coincidência. Seu princípio real é que, como o formato de codificação especificado pelo protocolo FTP é "ISO-8859-1", precisamos realmente converter o formato e depois convertê-lo automaticamente no próprio formato de codificação do sistema quando o servidor recebe o arquivo. Portanto, a chave não é especificar o formato, mas depender do formato de codificação do servidor FTP. Portanto, se o formato de codificação do sistema FTP for "GBK", o segundo método definitivamente terá sucesso; No entanto, se o formato de codificação do sistema for "UTF-8", ainda haverá código iluminado. Portanto, só podemos obter o formato de codificação do sistema através do código e depois convertê-lo no formato de codificação do ISO-8859-1 através deste formato de codificação. O método de aquisição é o seguinte:
codificação de string estática privada = system.getProperty ("file.encoding");
Todos os códigos acima foram testados por si mesmo, espero que eles possam resolver o problema para todos!