詳解JAVA中使用FTPClient工具類上傳下載
詳解JAVA中使用FTPClient工具類上傳下載
在Java程序中,經(jīng)常需要和FTP打交道,比如向FTP服務(wù)器上傳文件、下載文件。本文簡單介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實(shí)現(xiàn)上傳下載文件。
1、寫一個(gè)javabean文件,描述ftp上傳或下載的信息
實(shí)例代碼:
public class FtpUseBean {
private String host;
private Integer port;
private String userName;
private String password;
private String ftpSeperator;
private String ftpPath="";
private int repeatTime = 0;//連接ftp服務(wù)器的次數(shù)
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setFtpSeperator(String ftpSeperator) {
this.ftpSeperator = ftpSeperator;
}
public String getFtpSeperator() {
return ftpSeperator;
}
public void setFtpPath(String ftpPath) {
if(ftpPath!=null)
this.ftpPath = ftpPath;
}
public String getFtpPath() {
return ftpPath;
}
public void setRepeatTime(int repeatTime) {
if (repeatTime > 0)
this.repeatTime = repeatTime;
}
public int getRepeatTime() {
return repeatTime;
}
/**
* take an example:<br>
* ftp://userName:password@ip:port/ftpPath/
* @return
*/
public String getFTPURL() {
StringBuffer buf = new StringBuffer();
buf.append("ftp://");
buf.append(getUserName());
buf.append(":");
buf.append(getPassword());
buf.append("@");
buf.append(getHost());
buf.append(":");
buf.append(getPort());
buf.append("/");
buf.append(getFtpPath());
return buf.toString();
}
}
2、導(dǎo)入包c(diǎn)ommons-net-1.4.1.jar
package com.util;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
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.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import com.bean.FtpUseBean;
public class FtpUtil extends FTPClient {
private static Log log = LogFactory.getLog(FtpUtil.class);
private FtpUseBean ftpUseBean;
//獲取目標(biāo)路徑下的文件屬性信息,主要是獲取文件的size
private FTPFile[] files;
public FtpUseBean getFtpUseBean() {
return ftpUseBean;
}
public FtpUtil(){
super();
}
public void setFtpUseBean(FtpUseBean ftpUseBean) {
this.ftpUseBean = ftpUseBean;
}
public boolean ftpLogin() {
boolean isLogined = false;
try {
log.debug("ftp login start ...");
int repeatTime = ftpUseBean.getRepeatTime();
for (int i = 0; i < repeatTime; i++) {
super.connect(ftpUseBean.getHost(), ftpUseBean.getPort());
isLogined = super.login(ftpUseBean.getUserName(), ftpUseBean.getPassword());
if (isLogined)
break;
}
if(isLogined)
log.debug("ftp login successfully ...");
else
log.debug("ftp login failed ...");
return isLogined;
} catch (SocketException e) {
log.error("", e);
return false;
} catch (IOException e) {
log.error("", e);
return false;
} catch (RuntimeException e) {
log.error("", e);
return false;
}
}
public void setFtpToUtf8() throws IOException {
FTPClientConfig conf = new FTPClientConfig();
super.configure(conf);
super.setFileType(FTP.IMAGE_FILE_TYPE);
int reply = super.sendCommand("OPTS UTF8 ON");
if (reply == 200) { // UTF8 Command
super.setControlEncoding("UTF-8");
}
}
public void close() {
if (super.isConnected()) {
try {
super.logout();
super.disconnect();
log.debug("ftp logout ....");
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e.toString());
}
}
}
public void uploadFileToFtpByIS(InputStream inputStream, String fileName) throws IOException {
super.storeFile(ftpUseBean.getFtpPath()+fileName, inputStream);
}
public File downFtpFile(String fileName, String localFileName) throws IOException {
File outfile = new File(localFileName);
OutputStream oStream = null;
try {
oStream = new FileOutputStream(outfile);
super.retrieveFile(ftpUseBean.getFtpPath()+fileName, oStream);
return outfile;
} finally {
if (oStream != null)
oStream.close();
}
}
public FTPFile[] listFtpFiles() throws IOException {
return super.listFiles(ftpUseBean.getFtpPath());
}
public void deleteFtpFiles(FTPFile[] ftpFiles) throws IOException {
String path = ftpUseBean.getFtpPath();
for (FTPFile ff : ftpFiles) {
if (ff.isFile()) {
if (!super.deleteFile(path + ff.getName()))
throw new RuntimeException("delete File" + ff.getName() + " is n't seccess");
}
}
}
public void deleteFtpFile(String fileName) throws IOException {
if (!super.deleteFile(ftpUseBean.getFtpPath() +fileName))
throw new RuntimeException("delete File" + ftpUseBean.getFtpPath() +fileName + " is n't seccess");
}
public InputStream downFtpFile(String fileName) throws IOException {
return super.retrieveFileStream(ftpUseBean.getFtpPath()+fileName);
}
/**
*
* @return
* @return StringBuffer
* @description 下載ftp服務(wù)器上的文件,addr為帶用戶名和密碼的URL
*/
public StringBuffer downloadBufferByURL(String addr) {
BufferedReader in = null;
try {
URL url = new URL(addr);
URLConnection conn = url.openConnection();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuffer ret = new StringBuffer();
while ((line = in.readLine()) != null)
ret.append(line);
return ret;
} catch (Exception e) {
log.error(e);
return null;
} finally {
try {
if (null != in)
in.close();
} catch (IOException e) {
e.printStackTrace();
log.error(e);
}
}
}
/**
*
* @return
* @return byte[]
* @description 下載ftp服務(wù)器上的文件,addr為帶用戶名和密碼的URL
*/
public byte[] downloadByteByURL(String addr) {
FTPClient ftp = null;
try {
URL url = new URL(addr);
int port = url.getPort()!=-1?url.getPort():21;
log.info("HOST:"+url.getHost());
log.info("Port:"+port);
log.info("USERINFO:"+url.getUserInfo());
log.info("PATH:"+url.getPath());
ftp = new FTPClient();
ftp.setDataTimeout(30000);
ftp.setDefaultTimeout(30000);
ftp.setReaderThread(false);
ftp.connect(url.getHost(), port);
ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);
FTPClientConfig conf = new FTPClientConfig("UNIX");
ftp.configure(conf);
log.info(ftp.getReplyString());
ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()
ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
int reply = ftp.sendCommand("OPTS UTF8 ON");// try to
log.debug("alter to utf-8 encoding - reply:" + reply);
if (reply == 200) { // UTF8 Command
ftp.setControlEncoding("UTF-8");
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
log.info(ftp.getReplyString());
ByteArrayOutputStream out=new ByteArrayOutputStream();
DataOutputStream o=new DataOutputStream(out);
String remotePath = url.getPath();
/**
* Fixed:if doen't remove the first "/" at the head of url,
* the file can't be retrieved.
*/
if(remotePath.indexOf("/")==0) {
remotePath = url.getPath().replaceFirst("/", "");
}
ftp.retrieveFile(remotePath, o);
byte[] ret = out.toByteArray();
o.close();
String filepath = url.getPath();
ftp.changeWorkingDirectory(filepath.substring(0,filepath.lastIndexOf("/")));
files = ftp.listFiles();
return ret;
} catch (Exception ex) {
log.error("Failed to download file from ["+addr+"]!"+ex);
} finally {
try {
if (null!=ftp)
ftp.disconnect();
} catch (Exception e) {
//
}
}
return null;
// StringBuffer buffer = downloadBufferByURL(addr);
// return null == buffer ? null : buffer.toString().getBytes();
}
public FTPFile[] getFiles() {
return files;
}
public void setFiles(FTPFile[] files) {
this.files = files;
}
// public static void getftpfilesize(String addr){
//
// FTPClient ftp = null;
//
// try {
//
// URL url = new URL(addr);
//
// int port = url.getPort()!=-1?url.getPort():21;
// log.info("HOST:"+url.getHost());
// log.info("Port:"+port);
// log.info("USERINFO:"+url.getUserInfo());
// log.info("PATH:"+url.getPath());
//
// ftp = new FTPClient();
//
// ftp.setDataTimeout(30000);
// ftp.setDefaultTimeout(30000);
// ftp.setReaderThread(false);
// ftp.connect(url.getHost(), port);
// ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);
// FTPClientConfig conf = new FTPClientConfig("UNIX");
// ftp.configure(conf);
// log.info(ftp.getReplyString());
//
// ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()
// ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
//
// int reply = ftp.sendCommand("OPTS UTF8 ON");// try to
//
// log.debug("alter to utf-8 encoding - reply:" + reply);
// if (reply == 200) { // UTF8 Command
// ftp.setControlEncoding("UTF-8");
// }
// ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// ftp.changeWorkingDirectory(url.getPath());
// FTPFile[] files = ftp.listFiles();
// for (FTPFile flie : files){
// System.out.println(new String(flie.getName().getBytes("gbk"),"ISO8859-1"));
// System.out.println(flie.getSize());
// }
//
//
// } catch (Exception ex) {
// log.error("Failed to download file from ["+addr+"]!"+ex);
// } finally {
// try {<pre class="java" name="code"> if (null!=ftp)
// ftp.disconnect();
// } catch (Exception e) {
}
}
}
}
以上就是JAVA FTPClient工具類的上傳和下載的實(shí)例詳解,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼
- JAVA技術(shù)實(shí)現(xiàn)上傳下載文件到FTP服務(wù)器(完整)
- Java通過FTP服務(wù)器上傳下載文件的方法
- Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法
- Java實(shí)現(xiàn)FTP批量大文件上傳下載篇1
- Java實(shí)現(xiàn)ftp文件上傳下載解決慢中文亂碼多個(gè)文件下載等問題
- Java FTPClient實(shí)現(xiàn)文件上傳下載
- Java實(shí)現(xiàn)FTP批量大文件上傳下載篇2
- Java FTP上傳下載刪除功能實(shí)例代碼
- Java工具jsch.jar實(shí)現(xiàn)上傳下載
相關(guān)文章
使用Springboot+Vue實(shí)現(xiàn)文件上傳和下載功能
本文介紹了如何使用Springboot結(jié)合Vue進(jìn)行圖書信息管理系統(tǒng)開發(fā),包括數(shù)據(jù)庫表的創(chuàng)建,實(shí)體類、Dao層、Service層和Controller層的編寫,重點(diǎn)講解了文件上傳和下載功能的實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧2024-09-09
Spring根據(jù)URL參數(shù)進(jìn)行路由的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring根據(jù)URL參數(shù)進(jìn)行路由的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起來看看吧。2017-12-12
Java中String、StringBuffer和StringBuilder的區(qū)別與使用場景
在Java編程中,String、StringBuffer和StringBuilder是用于處理字符串的常見類,它們?cè)诳勺冃?、線程安全性和性能方面有所不同,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
Linux 下通過 java 命令啟動(dòng) jar 包常見方式小結(jié)
這篇文章主要介紹了Linux 下通過 java 命令啟動(dòng) jar 包常見方式小結(jié),后臺(tái)啟動(dòng)jar包命令大致有五種,每種方式結(jié)合代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-12-12

