最近項目中需要實現將文件先存放到ftp上,需要的時候再從ftp上下載,做的過程中碰到了問題,發現中文文件名的無法上傳到ftp上,ftp上的中文文件名的文件下載不下來,幾番折騰,終於搞定了,記錄一下備忘。
iis7服務器管理工具(曾用名:IIS7遠程桌面)當前可批量管理的為:win系列的操作系統(含VPS、VM)、linux操作系統:CentOS、Ubuntu、Debian等,支持命令及可視化SFTP管理、linux的vnc、win的vnc、FTP,webshell
IIS7服務器管理工具可以批量管理、定時上傳下載、同步操作、數據備份、到期提醒、自動更新。IIS7服務器管理工具適用於Windows操作系統和liunx操作系統;支持Ftp客戶端批量操作。
下載地址
:http://fwqglgj.iis7.net/cp/ftp/?hcfd-zc
首先給工程添加maven依賴,pom.xml文件中添加:
<code><
dependency
><
groupId
>commons-netgroupId
><
artifactId
>commons-netartifactId
><
version
>1.4.1version
>dependency
>/<code>
以下是Ftp工具類:
<code>package
com.test.util; import java.io
.File;import java.io
.FileNotFoundException;import java.io
.FileOutputStream;import java.io
.IOException;import java.io
.InputStream;import java.io
.OutputStream;import java.net.SocketException; import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPReply; 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服務器 ftpClient.setControlEncoding("UTF-8"
); // 中文支持 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode();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 FTP服務器上要下載的文件名稱 * @param targetFileName FTP服務器上要下載的文件名稱 */ public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName) { FTPClient ftpClient = null; try { ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); ftpClient.changeWorkingDirectory(ftpPath); String f_ame = new String(fileName.getBytes("GBK"
), FTP.DEFAULT_CONTROL_ENCODING); //編碼文件格式,解決中文文件名 File localFile = new File(localPath + File.separatorChar + targetFileName); OutputStreamos
= new FileOutputStream(localFile); ftpClient.retrieveFile(f_ame,os
);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(); } } /** * Description: 向FTP服務器上傳文件 * @param host FTP服務器hostname * @param port FTP服務器端口 * @param username FTP登錄賬號 * @param password FTP登錄密碼 * @param basePath FTP服務器基礎目錄 * @param filePath FTP服務器文件存放路徑。例如分日期存放:/2015
/01
/01
。文件的路徑為basePath+filePath * @param filename 上傳到FTP服務器上的文件名 * @paraminput
輸入流 * @return
成功返回true
,否則返回false
*/ public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String filename, InputStreaminput
) { boolean result =false
; FTPClient ftpClient = new FTPClient(); try { int reply; ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort); ftpClient.changeWorkingDirectory(ftpPath); reply = ftpClient.getReplyCode();if
(!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect();return
result; } filename = new String(filename.getBytes("GBK"
), FTP.DEFAULT_CONTROL_ENCODING); //編碼文件名,支持中文文件名 //上傳文件if
(!ftpClient.storeFile(filename,input
)) {return
result; }input
.close
(); ftpClient.logout(); result =true
; } catch (IOException e) { e.printStackTrace(); } finally {if
(ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } }return
result; } public static void main(String[] args) { String ftpHost ="192.168.20.40"
; String ftpUserName ="test"
; String ftpPassword ="12345"
; int ftpPort =21
; String ftpPath ="test/"
; String fileName ="test_通知_4724.docx"
; //上傳一個文件 try{ String tmpPath = System.getProperty("java.io.tmpdir"
); FileInputStreamin
=new FileInputStream(new File("D:"
+ fileName)); FtpUtil.uploadFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, fileName,in
); System.out.println(tmpPath); FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath,"E:"
,"test_通知_4724.docx"
,"測試下載文件.docx"
); } catch (Exception e){ e.printStackTrace(); System.out.println(e); } }}/<code>