1. 程式人生 > >FTPClient實現ftp的上傳下載(包含中文檔名和中文路徑問題)

FTPClient實現ftp的上傳下載(包含中文檔名和中文路徑問題)

整理一個ftp上傳下載的工具類,轉編碼的問題經測試都已經很好的解決,我這裡用的ftp為Windows系統下,Linux下的ftp操作寫法不一樣,下次有用到再整理:

FtpUtil

  • jar commons-net-3.3.jar
  • maven依賴
    <dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.1</version>
    </dependency>
public class FtpUtil {  

    private final static Log logger = LogFactory.getLog(FtpUtil.class);  

    /** 
     * 獲取FTPClient物件 
     * 
     * @param ftpHost 
     *            FTP主機伺服器 
     * @param ftpPassword 
     *            FTP 登入密碼 
     * @param ftpUserName 
     *            FTP登入使用者名稱 
     * @param
ftpPort * FTP埠 預設為21 * @return */
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 連線FTP伺服器
ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP伺服器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.info("未連線到FTP,使用者名稱或密碼錯誤。"); ftpClient.disconnect(); } else { logger.info("FTP連線成功。"); } } catch (SocketException e) { e.printStackTrace(); logger.info("FTP的IP地址可能錯誤,請正確配置。"); } catch (IOException e) { e.printStackTrace(); logger.info("FTP的埠錯誤,請正確配置。"); } return ftpClient; } /* * 從FTP伺服器下載檔案 * * @param ftpHost FTP IP地址 * * @param ftpUserName FTP 使用者名稱 * * @param ftpPassword FTP使用者名稱密碼 * * @param ftpPort FTP埠 * * @param ftpPath FTP伺服器中檔案所在路徑 格式: ftptest/aa * * @param localPath 下載到本地的位置 格式:H:/download * * @param fileName 檔名稱 */ public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName) { FTPClient ftpClient = null; try { String ftpPath2 = new String(ftpPath.getBytes("GBK"),"iso-8859-1"); ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); ftpClient.setControlEncoding("UTF-8"); // 中文支援 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); boolean flag1 = ftpClient.changeWorkingDirectory(ftpPath2); if (!flag1) { logger.error("沒有找到" + ftpPath + "---該路徑"); return; } File localFile = new File(localPath + File.separatorChar + new String(fileName.getBytes("GBK"),"UTF-8")); OutputStream os = new FileOutputStream(localFile); //複製檔案流 boolean flag2 = ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"iso-8859-1"), os); if (!flag2) { logger.error("沒有找到" + fileName + "---該檔案"); localFile.delete(); } os.close(); ftpClient.logout(); } catch (FileNotFoundException e) { logger.error("沒有找到" + ftpPath + "檔案"); e.printStackTrace(); } catch (SocketException e) { logger.error("連線FTP失敗."); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); logger.error("檔案讀取錯誤。"); e.printStackTrace(); } } /** * 上傳部分程式碼如下: * @param ftpHost:檔案伺服器主機地址 * @param ftpPort:檔案伺服器埠號 * @param ftpUserName:使用者名稱 * @param ftpPassword:密碼 * @param path:檔案要儲存的路徑 * @param filename:檔名字 * @param localPath:本地檔案路徑 * @return */ public static void uploadToFTPServer(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String path, String filename, String localPath) { FTPClient ftpClient = null; // 建立一個客戶端例項 try { path = new String(path.getBytes("GBK"),"iso-8859-1"); ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); // ftp.makeDirectory("bbb");//建立檔案目錄 ftpClient.changeWorkingDirectory(path); ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 設定檔案以二進位制的形式上傳,防止檔案內容亂碼出現 // 設定檔名字的編碼格式為iso-8859-1,因為FTP上傳的時候預設編碼為iso-8859-1,解決檔名字亂碼的問題 filename = new String(filename.getBytes("GBK"), "iso-8859-1"); InputStream in = new FileInputStream(new File(localPath)); ftpClient.storeFile(filename, in); // 開始上傳檔案 in.close();// 關閉檔案輸入流 ftpClient.logout();// 斷開和ftp伺服器之間的連線 } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } } public static String getFullCurrentWorkingDirectory(FTPClient ftpClient) throws IOException{ String[] dir = ftpClient.doCommandAsStrings("pwd",""); System.out.println(dir[0]); Pattern p=Pattern.compile("\"(.*?)\""); Matcher m=p.matcher(dir[0]); String fullPath = null; if(m.find()){ fullPath = m.group(0).replace("\"",""); } return fullPath; } public static String getRelativeCurrentWorkingDirectory(FTPClient ftpClient) throws IOException{ String[] dir = ftpClient.doCommandAsStrings("pwd",""); System.out.println(dir[0]); return ""; } public static void showFile(FTPClient ftpClient) throws IOException{ FTPFile[] files = ftpClient.listFiles(); for(FTPFile f : files){ if(f.isDirectory()){ System.out.println(f.getName()+"-----directory"); ftpClient.changeWorkingDirectory(f.getName()); showFile(ftpClient); }else if(f.isFile()){ System.out.println(f.getName()); } } ftpClient.changeToParentDirectory(); } }

需要幾個坑

  1. ftp的路徑出錯或檔案不存在的情況話下載會出現空檔案,我這裡的處理方式也很簡單,失敗即刪了本地新建的檔案。
  2. 中文路徑和中文檔名的處理情況不太一樣,iso-8859-1是ftp預設的編碼格式,路徑轉換了就行,但是檔名要特別注意的是下載時,new本地檔案時給的檔名一定得是中文,而retrieveFile進行ftp檔案操作時得轉換編碼對應。
  3. setFileType的方式可有效防止檔案內容亂碼

相關推薦

FTPClient實現ftp下載包含中文檔名中文路徑問題

整理一個ftp上傳下載的工具類,轉編碼的問題經測試都已經很好的解決,我這裡用的ftp為Windows系統下,Linux下的ftp操作寫法不一樣,下次有用到再整理: FtpUtil jar commons-net-3.3.jar maven依賴

java實現FTP下載FTPClient類進行FTP下載大檔案(包含導致假死現象)

介紹:  FTPClient是一個強大的FTP上傳下載工具,可以實現各種方式的ftp檔案傳輸,可以支援上傳下載各種大檔案(已在實踐中使用),而且存在官網使使用者方便的使用這個工具等等。 1.首先,程式中設定ftp請求方式為被動模式,即程式去請求ftp伺服器,要求伺服器來

spring boot使用nginxftp伺服器實現圖片下載windows server

本人使用的springboot為1.5.6版本<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-pa

JAVA 實現FTP下載(sun.net.ftp.FtpClient)

package com.why.ftp;      import java.io.DataInputStream;      import java.io.File;      import java.io.FileInputStream;      import java

Linux系統中使用lftp命令實現FTP下載

lcd 工作 亂碼問題 pwd -- cd 命令 史記 size ls 命令 Linux 下常用的操作命令有 ftp、 lftp 和 sftp,圖形化界面非常好用的有 FileZilla。不過在服務器命令界面中,lftp使用比較方便,功能也比ftp更加強大。lftp的界面

CentOS 安裝rzsz命令,實現ftp下載功能

lrzsz在linux裡可代替ftp上傳和下載。 windows 需要向centos伺服器上傳檔案,可直接在centos上執行命令yum -y install lrzsz 程式會自動安裝好,然後如你要下載者sz [找到你要下載的檔案] 如果你要上傳,者rz 瀏覽找到你

Shell指令碼實現FTP下載檔案

Linux下使用Shell指令碼實現FTP自動上傳和下載檔案 登入FTP實現下載檔案功能 FTP伺服器:10.11.10.11 FTP路徑:Down 本地路徑: ./ 將檔案從FTP下載到本地的指令碼如下: 批量下載指令碼程式碼 #從

Java 實現Ftp下載檔案

最近專案中需要實現將檔案先存放到ftp上,需要的時候再從ftp上下載,做的過程中碰到了問題,發現中文檔名的無法上傳到ftp上,ftp上的中文檔名的檔案下載不下來,幾番折騰,終於搞定了,記錄一下備忘。首先給工程新增maven依賴,pom.xml檔案中新增:<depende

使用Apache Commons Net API實現FTP下載過程中的坑點

       最近專案需要實現FTP上傳、下載功能,採用了Apache Commons Net API。程式碼很快就完成了,但由於對相關API使用場景不是很熟悉,走了一些彎路,抽一點時間做一下總結。         A)主動被動模式選擇:FTP主動模式和被動模式的詳細介紹可

C#實現FTP下載功能

//ftp的上傳功能     private void Upload(string filename)     {         FileInfo fileInf = new FileInfo(filename);         string uri = "ftp://

Java FTP下載實現

.net 一個 bin 上傳文件 pre 上傳下載 ole 切換 apach 昨天修改了一個接口,看到它涉及FTP的上傳與下載,用的是:org.apache.commons.net.ftp.FTPClient,它只支持FTP,不支持SFTP 總結下來如此使用: //創建對

高可用的Spring FTP下載工具類已解決過程常見問題

關於 package 輸入 .net rop inpu pasv for factory 前言 最近在項目中需要和ftp服務器進行交互,在網上找了一下關於ftp上傳下載的工具類,大致有兩種。   第一種是單例模式的類。   第二種是另外定義一個Service,直接通過

2.2.2解決方案壓縮文件異機備份到PC2局域網共享與FTP下載

images http 壓縮文件 技術 nag image 圖片 pc2 需要 Windows命令行batcmd腳本的應用之自動備份 異地備份2.2.2解決方案壓縮文件異機備份到PC2 需求描述 環境:PC1:192.168.1.201 PC2:192.168.1.

java實現FTP(檔案)、下載(檔案、資料夾、資料夾遞迴)、刪除(檔案、資料夾遞迴)

提示:必須先保證有在FTP上上傳、下載、刪除的許可權! 本文結構 ---- 先給出測試樣例(圖片版),再給出工具類程式碼(文字版)! 上傳測試 注意:.uploadFile(String remoteDir, String remoteFileName, F

php實現FTPFTP下載FTP移動、FTP建立等

1. 使用PHP操作FTP-用法 <?php // 聯接FTP伺服器 $conn = ftp_connect(ftp.server.com); // 使用username和password登入 ftp_login($conn, “john”, “doe”);

SpringMVC_20_使用HttpMessageConverter T 實現檔案不推薦下載檔案操作

使用HttpMessageConverter< T>將請求資訊轉化並繫結到處理方法的入參中或將響應結果轉化為對應型別的響應資訊,Spring提供了兩種途徑: 使用@RequestBody/@ResponseBody對處理方法進行標註 使用Ht

Struts+Spring+Hibernate實現下載spring的最低框架配置,web.xml等

引言  檔案的上傳和下載在J2EE程式設計已經是一個非常古老的話題了,也許您馬上就能掰著指頭數出好幾個著名的大件:如SmartUpload、Apache的FileUpload。但如果您的專案是構建在Struts+Spring+Hibernate(以下稱SSH)框架上的,這些大

Ftp下載檔案,並能自定義進度條展示(FtpClient)

前一段時間,自己寫了一個java專案釋出在一個免費的java平臺上但是該平臺給專案的是虛擬路徑並不能上傳檔案。後來想到應用ftp作為上傳檔案的儲存器。 ftp上傳的工具類有sun(sun.net.*)和apache(org.apache.commons.net.ftp.* 

java實現檔案下載ftp伺服器

以前做的一個專案,用到了檔案上傳下載至ftp伺服器,現在對其進行一下複習,比較簡單,一下就能看明白。 環境:首先,先安裝ftp伺服器,我是在win8本地用IIS配置的, 百度一下就可以找到安裝文件。 1.在你的專案目錄下建立ftp配置檔案,目錄如下圖

使用httpclient實現下載javaWeb系統資料傳輸http實現

目的:專案被拆分為兩個javaWeb專案,實現專案之間資料傳輸以及上傳、下載功能。 前臺展示專案A,後臺提供資料支援專案B 題外話: 兩個javaWeb傳輸之間使用json比較方便,如果恰好使用SpringMVC,配置相關JSON轉換工具(功能很強大非常好用),在@Con