Java實(shí)現(xiàn)FTP上傳與下載功能
本文實(shí)例為大家分享了Java實(shí)現(xiàn)FTP上傳與下載的具體代碼,供大家參考,具體內(nèi)容如下
JAVA操作FTP服務(wù)器,只需要創(chuàng)建一個(gè)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)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
解決springboot application.properties server.port配置問題
這篇文章主要介紹了解決springboot application.properties server.port配置問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
mybatis框架xml下trim中的prefix與suffix等標(biāo)簽的用法
這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標(biāo)簽的用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java適配器模式的實(shí)現(xiàn)及應(yīng)用場景
適配器模式是Java中一種常用的設(shè)計(jì)模式,它通過將一個(gè)類的接口轉(zhuǎn)換成客戶端所期望的另一種接口來實(shí)現(xiàn)不同接口之間的兼容性。適配器模式主要應(yīng)用于系統(tǒng)的接口不兼容、需要擴(kuò)展接口功能以及需要適應(yīng)不同環(huán)境的場景2023-04-04
IDEA插件(BindED)之查看class文件的十六進(jìn)制
這篇文章主要介紹了IDEA插件(BindED)之查看class文件的十六進(jìn)制,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java動態(tài)規(guī)劃之丑數(shù)問題實(shí)例講解
這篇文章主要介紹了Java動態(tài)規(guī)劃之丑數(shù)問題實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09

