Java實現(xiàn)FTP上傳與下載功能
本文實例為大家分享了Java實現(xiàn)FTP上傳與下載的具體代碼,供大家參考,具體內(nèi)容如下
JAVA操作FTP服務(wù)器,只需要創(chuàng)建一個FTPClient即可,所有的操作都封裝在FTPClient中,JDK自帶的有FTPClient(sun.net.ftp.FtpClient),也可以用第三方的FTPClient,一般使用apache的FTPClient(org.apache.commons.net.ftp.FTPClient),本文將使用apache的FTPClient,API都大同小異
關(guān)鍵依賴:commons-net
對常用操作(上傳、下載)封裝成工具類
package com.day0322; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** ?* FTP工具類 ?* 文件上傳 ?* 文件下載 ?*/ public class FTPUtil { ? ? private static final Logger log = LoggerFactory.getLogger(FTPUtil.class); ? ? /** ? ? ?* 設(shè)置緩沖區(qū)大小4M ? ? ?**/ ? ? private static final int BUFFER_SIZE = 1024 * 1024 * 4; ? ? /** ? ? ?* 本地字符編碼 ? ? ?**/ ? ? private static String LOCAL_CHARSET = "GBK"; ? ? /** ? ? ?* UTF-8字符編碼 ? ? ?**/ ? ? private static final String CHARSET_UTF8 = "UTF-8"; ? ? /** ? ? ?* OPTS UTF8字符串常量 ? ? ?**/ ? ? private static final String OPTS_UTF8 = "OPTS UTF8"; ? ? /** ? ? ?* FTP協(xié)議里面,規(guī)定文件名編碼為iso-8859-1 ? ? ?**/ ? ? private static final String SERVER_CHARSET = "ISO-8859-1"; ? ? private static FTPClient ftpClient = null; ? ? /** ? ? ?* 連接FTP服務(wù)器 ? ? ?*/ ? ? private static void login(OaFtp oaFtp) { ? ? ? ? ftpClient = new FTPClient(); ? ? ? ? try { ? ? ? ? ? ? ftpClient.connect(oaFtp.getIp(), Integer.valueOf(oaFtp.getPort())); ? ? ? ? ? ? ftpClient.login(oaFtp.getName(), oaFtp.getPwd()); ? ? ? ? ? ? ftpClient.setBufferSize(BUFFER_SIZE); ? ? ? ? ? ? ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ? ? ? ? ? ? int reply = ftpClient.getReplyCode(); ? ? ? ? ? ? if (!FTPReply.isPositiveCompletion(reply)) { ? ? ? ? ? ? ? ? closeConnect(); ? ? ? ? ? ? } ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? log.error("",e); ? ? ? ? ? ? throw new RuntimeException(e); ? ? ? ? } ? ? } ? ? /** ? ? ?* 關(guān)閉FTP連接 ? ? ?*/ ? ? private static void closeConnect() { ? ? ? ? if (ftpClient != null && ftpClient.isConnected()) { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ftpClient.logout(); ? ? ? ? ? ? ? ? ftpClient.disconnect(); ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? log.error("",e); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? /** ? ? ?* FTP服務(wù)器路徑編碼轉(zhuǎn)換 ? ? ?* ? ? ?* @param ftpPath FTP服務(wù)器路徑 ? ? ?* @return String ? ? ?*/ ? ? private static String changeEncoding(String ftpPath) { ? ? ? ? String directory = null; ? ? ? ? try { ? ? ? ? ? ? if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) { ? ? ? ? ? ? ? ? LOCAL_CHARSET = CHARSET_UTF8; ? ? ? ? ? ? } ? ? ? ? ? ? directory = new String(ftpPath.getBytes(LOCAL_CHARSET), SERVER_CHARSET); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? log.error("",e); ? ? ? ? } ? ? ? ? return directory; ? ? } ? ? /** ? ? ?* 改變工作目錄 ? ? ?* 如果沒有,則創(chuàng)建工作目錄 ? ? ?* @param path ? ? ?*/ ? ? private static void changeAndMakeWorkingDir(String path) { ? ? ? ? try { ? ? ? ? ? ? ftpClient.changeWorkingDirectory("/"); ? ? ? ? ? ? path = path.replaceAll("\\\\","/"); ? ? ? ? ? ? String[] path_array = path.split("/"); ? ? ? ? ? ? for (String s : path_array) { ? ? ? ? ? ? ? ? boolean b = ftpClient.changeWorkingDirectory(s); ? ? ? ? ? ? ? ? if (!b) { ? ? ? ? ? ? ? ? ? ? ftpClient.makeDirectory(s); ? ? ? ? ? ? ? ? ? ? ftpClient.changeWorkingDirectory(s); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? log.error("",e); ? ? ? ? ? ? throw new RuntimeException(e); ? ? ? ? } ? ? } ? ? /** ? ? ?* 上傳 ? ? ?* @param oaFtp ? ? ?* @param filename ? ? ?* @param dirPath ? ? ?* @param in ? ? ?* @return ? ? ?*/ ? ? public static boolean upload (OaFtp oaFtp, String filename, String dirPath, InputStream in) { ? ? ? ? login(oaFtp); ? ? ? ? if (!ftpClient.isConnected()) { ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? boolean isSuccess = false; ? ? ? ? if (ftpClient != null) { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(OPTS_UTF8, "ON"))) { ? ? ? ? ? ? ? ? ? ? LOCAL_CHARSET = CHARSET_UTF8; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ftpClient.setControlEncoding(LOCAL_CHARSET); ? ? ? ? ? ? ? ? String path = changeEncoding(dirPath); ? ? ? ? ? ? ? ? changeAndMakeWorkingDir(path); ? ? ? ? ? ? ? ? isSuccess = ftpClient.storeFile(new String(filename.getBytes(), SERVER_CHARSET), in); ? ? ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? ? ? log.error("",e); ? ? ? ? ? ? } finally { ? ? ? ? ? ? ? ? closeConnect(); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return isSuccess; ? ? } ? ? /** ? ? ?* 下載 ? ? ?* @param oaFtp ? ? ?* @param filename ? ? ?* @param dirPath ? ? ?* @param out ? ? ?* @return ? ? ?*/ ? ? public static void download (OaFtp oaFtp, String filename, String dirPath, FileOutputStream out) { ? ? ? ? // 登錄 ? ? ? ? login(oaFtp); ? ? ? ? if (ftpClient != null) { ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? String path = changeEncoding(dirPath); ? ? ? ? ? ? ? ? changeAndMakeWorkingDir(path); ? ? ? ? ? ? ? ? String[] fileNames = ftpClient.listNames(); ? ? ? ? ? ? ? ? if (fileNames == null || fileNames.length == 0) { ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? for (String fileName : fileNames) { ? ? ? ? ? ? ? ? ? ? String ftpName = new String(fileName.getBytes(SERVER_CHARSET), LOCAL_CHARSET); ? ? ? ? ? ? ? ? ? ? if (StringUtils.equals(ftpName,filename)) { ? ? ? ? ? ? ? ? ? ? ? ? InputStream in = ftpClient.retrieveFileStream(fileName); ? ? ? ? ? ? ? ? ? ? ? ? IOUtils.copy(in,out); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? log.error("",e); ? ? ? ? ? ? } finally { ? ? ? ? ? ? ? ? closeConnect(); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
測試
1.上傳
2.下載
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Netty分布式高性能工具類recycler的使用及創(chuàng)建
這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03解決springboot application.properties server.port配置問題
這篇文章主要介紹了解決springboot application.properties server.port配置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08mybatis框架xml下trim中的prefix與suffix等標簽的用法
這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Java動態(tài)規(guī)劃之丑數(shù)問題實例講解
這篇文章主要介紹了Java動態(tài)規(guī)劃之丑數(shù)問題實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09