国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java從ftp服務(wù)器上傳與下載文件

這篇具有很好參考價值的文章主要介紹了Java從ftp服務(wù)器上傳與下載文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、背景

業(yè)務(wù)需要從ftp服務(wù)器上上傳、下載、刪除文件等功能,通過查閱資料及手動敲打代碼,實現(xiàn)了操作ftp的基本功能,有需求的小伙伴可以看看具體的實現(xiàn)過程。

二、ftp介紹

摘自百度百科:文件傳輸協(xié)議(File Transfer Protocol,F(xiàn)TP)是用于在網(wǎng)絡(luò)上進行文件傳輸?shù)囊惶讟?biāo)準(zhǔn)協(xié)議,F(xiàn)TP允許用戶以文件操作的方式(如文件的增、刪、改、查、傳送等)與另一主機相互通信。

三、具體代碼實現(xiàn)

1、引入以下依賴

<!--apache下,包含連接ftp服務(wù)器的工具-->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

2、編寫一個FTP工具類

含以下四個方法:

*獲取一個FtpClinet連接

*關(guān)閉FtpClinet連接

*下載文件

*上傳文件

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.nio.charset.StandardCharsets;

@Slf4j
public class FtpUtil {

    /**
     * 獲取一個ftp連接
     * @param host ip地址
     * @param port 端口
     * @param username 用戶名
     * @param password 密碼
     * @return 返回ftp連接對象
     * @throws Exception 連接ftp時發(fā)生的各種異常
     */
    public static FTPClient getFtpClient(String host, Integer port, String username, String password) throws Exception{
        FTPClient ftpClient = new FTPClient();

        // 連接服務(wù)器
        ftpClient.connect(host, port);

        int reply = ftpClient.getReplyCode();
        if(!FTPReply.isPositiveCompletion(reply)){
            log.error("無法連接至ftp服務(wù)器, host:{}, port:{}", host, port);
            ftpClient.disconnect();
            return null;
        }

        // 登入服務(wù)器
        boolean login = ftpClient.login(username, password);
        if(!login){
            log.error("登錄失敗, 用戶名或密碼錯誤");
            ftpClient.logout();
            ftpClient.disconnect();
            return null;
        }

        // 連接并且成功登陸ftp服務(wù)器
        log.info("login success ftp server, host:{}, port:{}, user:{}", host, port, username);

        // 設(shè)置通道字符集, 要與服務(wù)端設(shè)置一致
        ftpClient.setControlEncoding("UTF-8");
        // 設(shè)置文件傳輸編碼類型, 字節(jié)傳輸:BINARY_FILE_TYPE, 文本傳輸:ASCII_FILE_TYPE, 建議使用BINARY_FILE_TYPE進行文件傳輸
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        // 動模式: enterLocalActiveMode(),被動模式: enterLocalPassiveMode(),一般選擇被動模式
        ftpClient.enterLocalPassiveMode();
        // 切換目錄
        //ftpClient.changeWorkingDirectory("xxxx");

        return ftpClient;
    }

    /**
     * 斷開ftp連接
     * @param ftpClient ftp連接客戶端
     */
    public static void disConnect(FTPClient ftpClient){
        if(ftpClient == null){
            return;
        }
        try {
            log.info("斷開ftp連接, host:{}, port:{}", ftpClient.getPassiveHost(), ftpClient.getPassivePort());
            ftpClient.logout();
            ftpClient.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("ftp連接斷開異常, 請檢查");
        }

    }

    /**
     * 文件下載
     * @param ftpClient ftp連接客戶端
     * @param path 文件路徑
     * @param fileName 文件名稱
     */
    public static void download(FTPClient ftpClient, String path, String fileName) throws Exception {
        if(ftpClient == null || path == null || fileName == null){
            return;
        }

        // 中文目錄處理存在問題, 轉(zhuǎn)化為ftp能夠識別中文的字符集
        String remotePath;
        try {
            remotePath = new String(path.getBytes(StandardCharsets.UTF_8), FTP.DEFAULT_CONTROL_ENCODING);
        } catch (UnsupportedEncodingException e) {
            remotePath = path;
        }

        InputStream inputStream = ftpClient.retrieveFileStream(remotePath);
        if (inputStream == null) {
            log.error("{}在ftp服務(wù)器中不存在,請檢查", path);
            return;
        }

        FileOutputStream outputStream = new FileOutputStream("D:\\test\\" + fileName);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
        try{
            byte[] buffer = new byte[2048];
            int i;
            while ((i = bufferedInputStream.read(buffer)) != -1) {
                bufferedOutputStream.write(buffer, 0, i);
                bufferedOutputStream.flush();
            }
        } catch (Exception e) {
            log.error("文件下載異常", e);
            log.error("{}下載異常,請檢查", path);
        }

        inputStream.close();
        outputStream.close();
        bufferedInputStream.close();
        bufferedOutputStream.close();

        // 關(guān)閉流之后必須執(zhí)行,否則下一個文件導(dǎo)致流為空
        boolean complete = ftpClient.completePendingCommand();
        if(complete){
            log.info("文件{}下載完成", remotePath);
        }else{
            log.error("文件{}下載失敗", remotePath);
        }

    }

    /**
     * 上傳文件
     * @param ftpClient ftp連接客戶端
     * @param sourcePath 源地址
     */
    public static void upload(FTPClient ftpClient, String sourcePath) throws Exception{
        if(ftpClient == null || sourcePath == null){
            return;
        }

        File file = new File(sourcePath);
        if(!file.exists() || !file.isFile()){
            return;
        }

        // 中文目錄處理存在問題, 轉(zhuǎn)化為ftp能夠識別中文的字符集
        String remotePath;
        try {
            remotePath = new String(file.getName().getBytes(StandardCharsets.UTF_8), FTP.DEFAULT_CONTROL_ENCODING);
        } catch (UnsupportedEncodingException e) {
            remotePath = file.getName();
        }
        
        try(
                InputStream inputStream = new FileInputStream(file);
                OutputStream outputStream = ftpClient.storeFileStream(remotePath);
        ){
            byte[] buffer = new byte[2048];
            int length;
            while((length = inputStream.read(buffer)) != -1){
                outputStream.write(buffer, 0, length);
                outputStream.flush();
            }
        }catch (Exception e){
            log.error("文件上傳異常", e);
        }

        // 關(guān)閉流之后必須執(zhí)行,否則下一個文件導(dǎo)致流為空
        boolean complete = ftpClient.completePendingCommand();
        if(complete){
            log.info("文件{}上傳完成", remotePath);
        }else{
            log.error("文件{}上傳失敗", remotePath);
        }


    }
}

3、測試連接、上傳文件、下載文件、關(guān)閉連接功能

@Slf4j
@RestController
public class FtpController {

    private static final String FTP_HOST = "your host";

    private static final Integer FTP_PORT = 21;

    private static final String FTP_USERNAME = "your username";

    private static final String FTP_PASSWORD = "your password";

    @GetMapping("/test")
    public void test() throws Exception{

        FTPClient ftpClient = FtpUtil.getFtpClient(FTP_HOST, FTP_PORT, FTP_USERNAME, FTP_PASSWORD);

        // 展示文件夾
        FTPFile[] ftpFiles = ftpClient.listDirectories();
        for(FTPFile file : ftpFiles){
            System.out.println(file.getName());
        }

        // 下載文件
        FtpUtil.download(ftpClient, "test.txt", "test.txt");

        //FtpUtil.download(ftpClient, "test.py", "test.py");
        // 上傳文件
        FtpUtil.upload(ftpClient, "D:\\test\\test.py");


        FtpUtil.disConnect(ftpClient);

    }


}

經(jīng)過測試,能夠正常連接上ftp服務(wù)器,并且上傳下載文件,最后關(guān)閉連接。

四、遇到的問題

在使用過程中,遇到以下問題,需要記錄一下,以防下次忘記:

就是在創(chuàng)建完一個FtpClient連接之后,關(guān)閉連接之前,第一次進行文件上傳或下載是正常的,當(dāng)?shù)诙芜M行文件上傳或下載時,從FtpClient獲取的輸入流或輸出流是空的。需要在每次操作完文件上傳或下載時,添加上以下代碼片段:

// 關(guān)閉流之后必須執(zhí)行,否則下一個文件導(dǎo)致流為空
boolean complete = ftpClient.completePendingCommand();
if(complete){
    log.info("文件{}下載完成", remotePath);
}else{
    log.error("文件{}下載失敗", remotePath);
}

該方法有以下注釋:

There are a few FTPClient methods that do not complete the entire sequence 
of FTP commands to complete a transaction. These commands require some action 
by the programmer after the reception of a positive intermediate command. 
After the programmer's code completes its actions, it must call this method 
to receive the completion reply from the server and verify the success of the 
entire transaction.

百度翻譯大致意思應(yīng)該是:有一些FTPClient方法不能完成完成事務(wù)的整個FTP命令序列。這些命令需要程序員在接收到肯定的中間命令后采取一些行動。程序員的代碼完成其操作后,必須調(diào)用此方法以從服務(wù)器接收完成回復(fù),并驗證整個事務(wù)的成功。

這里不知道是不是描述的我這種情況, completePedingCommand的意思是完成掛起命令。可能我們當(dāng)前場景就符合。剛興趣的小伙伴可以深入去探討一下。

五、參考連接

https://blog.csdn.net/AndyWei147/article/details/90745518

https://blog.csdn.net/weixin_39981289/article/details/128614774文章來源地址http://www.zghlxwxcb.cn/news/detail-468243.html

到了這里,關(guān)于Java從ftp服務(wù)器上傳與下載文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • lua 請求ftp服務(wù)器數(shù)據(jù),下載文件

    lua 請求ftp服務(wù)器數(shù)據(jù),下載文件

    1、裝入ftp庫 2、調(diào)用ftp的get()方法 3、get()方法參數(shù)格式: 4、將返回到的數(shù)據(jù)寫入文件中 例如,本次獲取專利數(shù)據(jù)系統(tǒng) http://patdata1.cnipa.gov.cn/ 的ftp站點數(shù)據(jù)

    2024年02月16日
    瀏覽(25)
  • Java 獲取遠程ftp服務(wù)器的文件

    Java 獲取遠程ftp服務(wù)器的文件

    最近做醫(yī)療的項目,涉及遠程訪問醫(yī)院的pacs服務(wù)器獲取醫(yī)療影像數(shù)據(jù)。由于醫(yī)院廠商只提供了ftp的相關(guān)信息。需要用java開發(fā)腳本來自動拉取T-1的數(shù)據(jù)。 涉及jar包 ### main函數(shù) 其中涉及的配置類 ftp client連接server端 通過上面的代碼實現(xiàn)自動拉取ftp服務(wù)端應(yīng)用目錄下面的文件(也

    2024年02月11日
    瀏覽(31)
  • Java 兩臺服務(wù)器間使用FTP進行文件傳輸

    背景:需要把服務(wù)器A中的文件拷貝至服務(wù)器B中,要求使用FTP進行傳輸,當(dāng)文件傳輸未完成時文件是tmp格式的,傳輸完畢后顯示為原格式(此處是grib2)。

    2024年02月15日
    瀏覽(25)
  • 純nginx制作文件上傳下載服務(wù)器

    純nginx制作文件上傳下載服務(wù)器

    webdav 是一組超文本傳輸協(xié)議的技術(shù)集合,有利于用戶鍵協(xié)同編輯和管理存儲在萬維網(wǎng)服務(wù)器文檔。同時來說就是,webdav可以讓用戶直接存儲,下載,編輯文件,操作文件需要進行用戶認證 需要的環(huán)境 linux上需要下載git(用來拉取鏡像) nginx版本為:nginx-1.22.0.tar.gz 至此,需要

    2024年02月15日
    瀏覽(94)
  • mac PyCharm 上傳文件到遠程服務(wù)器+遠程服務(wù)器下載到本地

    mac PyCharm 上傳文件到遠程服務(wù)器+遠程服務(wù)器下載到本地

    選擇SFTP name:test6 輸入ssh賬號和密碼。保存密碼和30s心跳。 Local path(本地mac機器):/Users/clevercode/PycharmProjects/test6 Root path(遠程服務(wù)機器):/home/clevercode/test6 Root path(遠程服務(wù)機器):/home/clevercode/test6 [2024/1/18, 10:56 AM] Upload file ‘/Users/clevercode/PycharmProjects/test6/f100.py’ t

    2024年01月19日
    瀏覽(30)
  • Spring MVC異步上傳、跨服務(wù)器上傳和文件下載

    Spring MVC異步上傳、跨服務(wù)器上傳和文件下載

    之前的上傳方案,在上傳成功后都會跳轉(zhuǎn)頁面。而在實際開發(fā)中,很多情況下上傳后不進行跳轉(zhuǎn),而是進行頁面的局部刷新,比如:上傳頭像成功后將頭像顯示在網(wǎng)頁中。這時候就需要使用異步文件上傳。 編寫JSP頁面,引入jQuery和jQuery表單上傳工具jquery.form.js【該js文件已經(jīng)

    2024年02月16日
    瀏覽(31)
  • MobaXterm上傳下載文件、文件夾到服務(wù)器上

    MobaXterm上傳下載文件、文件夾到服務(wù)器上

    ? 首先通過SSH與服務(wù)器建立連接,不懂的可查閱相關(guān)資料,CSDN里有很多介紹。 1、上傳下載文件 可以在命令輸入窗口,無需輸入命令,按ctrl單擊的同時鼠標(biāo)右鍵出現(xiàn)以下左圖,選擇receive file using Z-modem或者send file?using Z-modem來上傳或者下載文件。 也可以通過mobaxterm左側(cè)的導(dǎo)

    2024年02月11日
    瀏覽(23)
  • java通過FTP跨服務(wù)器動態(tài)監(jiān)聽讀取指定目錄下文件數(shù)據(jù)

    java通過FTP跨服務(wù)器動態(tài)監(jiān)聽讀取指定目錄下文件數(shù)據(jù)

    1、文件數(shù)據(jù)在A服務(wù)器(windows)(不定期在指定目錄下生成),項目應(yīng)用部署在B服務(wù)器(Linux); 2、項目應(yīng)用在B服務(wù)器,監(jiān)聽A服務(wù)器指定目錄,有新生成文件,進行讀取文件信息,持久化數(shù)據(jù); 3、提供兩塊內(nèi)容,第一安裝windows FTP服務(wù);第二項目源碼,希望可以幫助到你

    2024年02月03日
    瀏覽(30)
  • 怎么用SecureCRT從Linux服務(wù)器上傳、下載文件?

    怎么用SecureCRT從Linux服務(wù)器上傳、下載文件?

    我們在使用linux的過程中,不論是為了安裝相關(guān)軟件,還是其它目的,都可能需要上傳或者下載linux上的文件。這里演示一下在SecureCRT中向linux上傳和下載文件。 1、前言 需要上傳或者下載,需要使用rz和sz命令。如果linux上沒有這兩個命令工具,則需要先安裝(可以使用yum安裝

    2024年02月04日
    瀏覽(25)
  • 用mac終端給Linux服務(wù)器上傳、下載文件

    用mac終端給Linux服務(wù)器上傳、下載文件

    一、 (1)打開終端,在shell菜單下找到:\\\"新建遠程連接\\\"。 (2)在\\\"新建遠程連接\\\"下,找到\\\"安全文件傳輸(sftp)\\\"。 ?(3)新建新的IP,輸入用戶,點擊\\\"連接\\\",輸入密碼,進入sftp傳輸界面。 (4) 上傳mac本地文件至Linux服務(wù)器:put localfiledirectory remotefiledirectory 下載Linux服務(wù)器

    2024年02月16日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包