亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)FTP上傳與下載功能

 更新時間:2022年02月22日 15:45:04   作者:hehuijava  
這篇文章主要為大家詳細介紹了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)建

    這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • SpringMVC執(zhí)行過程詳細講解

    SpringMVC執(zhí)行過程詳細講解

    MVC是一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個組件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯,MVC分層有助于管理和架構(gòu)復(fù)雜的應(yīng)用程序
    2022-08-08
  • 解決springboot application.properties server.port配置問題

    解決springboot application.properties server.port配置問題

    這篇文章主要介紹了解決springboot application.properties server.port配置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 零基礎(chǔ)寫Java知乎爬蟲之抓取知乎答案

    零基礎(chǔ)寫Java知乎爬蟲之抓取知乎答案

    上篇文章我們已經(jīng)能把知乎的問題抓出來了,但是答案還木有抓出來。這一回合,我們就連著把答案也一起從網(wǎng)站中摳出來=。=
    2014-11-11
  • mybatis框架xml下trim中的prefix與suffix等標簽的用法

    mybatis框架xml下trim中的prefix與suffix等標簽的用法

    這篇文章主要介紹了mybatis框架xml下trim中的prefix與suffix等標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java適配器模式的實現(xiàn)及應(yīng)用場景

    Java適配器模式的實現(xiàn)及應(yīng)用場景

    適配器模式是Java中一種常用的設(shè)計模式,它通過將一個類的接口轉(zhuǎn)換成客戶端所期望的另一種接口來實現(xiàn)不同接口之間的兼容性。適配器模式主要應(yīng)用于系統(tǒng)的接口不兼容、需要擴展接口功能以及需要適應(yīng)不同環(huán)境的場景
    2023-04-04
  • IDEA插件(BindED)之查看class文件的十六進制

    IDEA插件(BindED)之查看class文件的十六進制

    這篇文章主要介紹了IDEA插件(BindED)之查看class文件的十六進制,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring中@Lazy注解的使用示例教程

    Spring中@Lazy注解的使用示例教程

    Spring在應(yīng)用程序上下文啟動時去創(chuàng)建所有的單例bean對象, 而@Lazy注解可以延遲加載bean對象,即在使用時才去初始化,這篇文章主要介紹了Spring中@Lazy注解的使用,需要的朋友可以參考下
    2023-06-06
  • Java動態(tài)規(guī)劃之丑數(shù)問題實例講解

    Java動態(tài)規(guī)劃之丑數(shù)問題實例講解

    這篇文章主要介紹了Java動態(tài)規(guī)劃之丑數(shù)問題實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • Java多個版本切換的幾種方法

    Java多個版本切換的幾種方法

    本文主要介紹了Java多個版本切換的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論