java-ftp 上傳、删除檔案(支援中文目錄、檔案名)
一、問題
描述:Java中FTPClient上傳中文目錄、中文檔案名亂碼問題解決方法
原因:FTP協定裡面,規定檔案名編碼為iso-8859-1,是以目錄名或檔案名需要轉碼。
解決方案:name=new String(name.getBytes("GBK"),"iso-8859-1"); 使用這個轉碼
二、ftp 上傳代碼
package me.grass.net;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPReply;
import me.grass.coder.Debug;
import me.grass.extend.StringExtend;
/**
*
* @author xxj
*/
public class FtpHelper implements Closeable {
private FTPClient ftpClient = null;
boolean _isLogin = false;
public static FtpHelper getInstance() {
return new FtpHelper();
}
/**
* 使用執行個體
* @param args
*/
public static void main(String[] args) {
FtpHelper ftp = FtpHelper.getInstance();
ftp.login("localhost", 21);
}
/**
*
* ftp 匿名登入
* @param ip ftp服務位址
* @param port 端口号
* @param uname 使用者名
* @param pass 密碼
*/
public boolean login(String ip,int port){
//如果沒有設定ftp使用者可将username設為anonymous,密碼為任意字元串
return login(ip, port,"anonymous","");
}
/**
*
* ftp登入
* @param ip ftp服務位址
* @param port 端口号
* @param uname 使用者名
* @param pass 密碼
*/
public boolean login(String ip,int port, String uname, String pass) {
ftpClient = new FTPClient();
// boolean flag=false;
try {
// 連接配接
ftpClient.connect(ip,port);
_isLogin = ftpClient.login(uname, pass);
Debug.printFormat("ftp:{0}",_isLogin?"登入成功":"登入失敗");
// 檢測連接配接是否成功
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
System.err.println("FTP伺服器拒絕連接配接 ");
return false;
}
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
/**
*
* ftp上傳檔案
* @param localFileName 待上傳檔案
* @param ftpDirName ftp 目錄名
* @param ftpFileName ftp目标檔案
* @return true||false
*/
public boolean uploadFile(String localFileName,String ftpDirName, String ftpFileName) {
Debug.printFormat("準備上傳 [{0}] 到 ftp://{1}{2}"
,localFileName
,ftpDirName
,ftpFileName);
if(StringExtend.isNullOrEmpty(ftpDirName))
ftpDirName="/";
if(StringExtend.isNullOrEmpty(ftpFileName))
throw new RuntimeException("上傳檔案必須填寫檔案名!");
//解決中文目錄、檔案名亂碼問題
try {
ftpDirName = new String(ftpDirName.getBytes("GBK"),"iso-8859-1");
ftpFileName = new String(ftpFileName.getBytes("GBK"),"iso-8859-1");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
throw new RuntimeException(e1.getMessage(), e1);
}
File srcFile = new File(localFileName);
if(!srcFile.exists())
throw new RuntimeException("檔案不存在:"+localFileName);
try (FileInputStream fis = new FileInputStream(srcFile)) {
// 設定上傳目錄
ftpClient.changeWorkingDirectory(ftpDirName);
ftpClient.setBufferSize(1024);
//解決上傳中文 txt 檔案亂碼
ftpClient.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
// 設定檔案類型(二進制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 上傳
if(ftpClient.storeFile(ftpFileName, fis)){
fis.close();
Debug.printFormat("檔案上傳成功:{0}{1}"
,ftpDirName
,ftpFileName);
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
}
}
/**
*
* 删除ftp上的檔案
*
* @param ftpFileName
* @return true || false
*/
public boolean removeFile(String ftpFileName) {
boolean flag = false;
Debug.printFormat("待删除檔案:{0}"
,ftpFileName);
try {
ftpFileName = new String(ftpFileName.getBytes("GBK"),"iso-8859-1");
flag = ftpClient.deleteFile(ftpFileName);
Debug.printFormat("删除檔案:[{0}]"
,flag?"成功":"失敗");
return flag;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/**
*
* 銷毀ftp連接配接
*
*/
private void closeFtpConnection() {
_isLogin = false;
if (ftpClient != null) {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
*
* 銷毀ftp連接配接
*
*/
@Override
public void close() {
this.closeFtpConnection();
}
}
三、測試方法
package me.grass.extend;
import static org.junit.Assert.*;
import javax.print.attribute.standard.Finishings;
import org.apache.taglibs.standard.lang.jstl.test.beans.PublicInterface2;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import me.grass.net.FtpHelper;
/**
*
* @author xxj
*/
public class FtpHelperTest {
FtpHelper ftp=null;
@Before
public void InitBinder(){
ftp = FtpHelper.getInstance();
ftp.login("localhost", 21);//匿名登入
}
@After
public void finish(){
ftp.close();
}
@Test
public void testUplodaFile() {
String localFile="D:/Temp/resource/img.jpg";
String ftpDir="temp";
String ftpFile=StringExtend.format("img-{0}.jpg"
, DateExtend.getDate("yyyyMMddHHmmss"));
boolean success = ftp.uploadFile(localFile,ftpDir, ftpFile);
assertTrue(success);
localFile="D:/Temp/resource/text.txt";
ftpDir="temp";
ftpFile=StringExtend.format("text-{0}.txt"
, DateExtend.getDate("yyyyMMddHHmmss"));
success = ftp.uploadFile(localFile,ftpDir, ftpFile);
assertTrue(success);
localFile="D:/Temp/resource/文本.txt";
ftpDir="temp";
ftpFile=StringExtend.format("文本-{0}.txt"
, DateExtend.getDate("yyyyMMddHHmmss"));
success = ftp.uploadFile(localFile,ftpDir, ftpFile);
assertTrue(success);
}
@Test
public void testRemove(){
boolean success = false;
String file ="/temp/文本-20170509175507.txt";
success = ftp.removeFile(file);
assertTrue(success);
}
}