java 中 FtpClient 實現 FTP 文件上傳、下載

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

源代碼大部分是網上找的,查來查去,找到幾個可以用的例子,改來改去,揉合成現在這個樣子。

一、 jar包準備(web service 的jar ?不需要)

?

二、配置文件:

?

配置文件內容:

?

ftpUserName=hn_name
ftpPassword=hn_pwd
ftpHost=10.3.4.222
ftpPort=21
ftpPath=/home/hn_dhmp
writeTempFielPath=D\:\\ftpDownLoad

?

?

?

?

?

?

三、 ftp 工具類:

?

?

<strong>package ftp;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;/*** ftp 上傳、下載工具類* @author JiangYu*/
public class FtpUtil {  private static Logger logger = Logger.getLogger(FtpUtil.class);  /** * 獲取FTPClient對象 * @param ftpHost FTP主機服務器 * @param ftpPassword FTP 登錄密碼 * @param ftpUserName FTP登錄用戶名 * @param ftpPort FTP端口 默認為21 * @return */  public static FTPClient getFTPClient(String ftpHost, String ftpPassword,  String ftpUserName, int ftpPort) {  FTPClient ftpClient = null;  try {  ftpClient = new FTPClient();  ftpClient.connect(ftpHost, ftpPort);// 連接FTP服務器  ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP服務器  if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  logger.info("未連接到FTP,用戶名或密碼錯誤 !");  ftpClient.disconnect();  } else {  logger.info("FTP連接成功。");  }  } catch (SocketException e) {  e.printStackTrace();  logger.info("請檢查FTP的IP地址 ! ");  } catch (IOException e) {  e.printStackTrace();  logger.info("請核對FTP的端口 ! ");  }  return ftpClient;  }  /*** 上傳本地文件到FTP服務器   * @param ftpPath 服務器上存放文件的路徑* @param ftpUserName ftp服務賬號* @param ftpPassword ftp服務密碼* @param ftpHost ftp服務ip* @param ftpPort ftp服務端口* @param fileContent 文件內容* @param writeTempFielPath 文件在本地的路徑*/public static String upload(String ftpPath, String ftpUserName, String ftpPassword,  String ftpHost, int ftpPort, String fileContent, String writeTempFielPath) {  FTPClient ftpClient = null;  String uploadResult = "";try {  ftpClient = getFTPClient(ftpHost, ftpPassword,  ftpUserName, ftpPort);  // 設置PassiveMode傳輸  ftpClient.enterLocalPassiveMode();  // 設置以二進制流的方式傳輸  ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  // 對遠程目錄的處理  String remoteFileName = ftpPath;  if (ftpPath.contains("/")) {  remoteFileName = ftpPath  .substring(ftpPath.lastIndexOf("/") + 1);  }  // 先把文件寫出到本地,再上傳到FTP上,最后再刪除 。String result = write(remoteFileName, fileContent,  writeTempFielPath);  if (result.contains("成功")) {  File f = new File(writeTempFielPath + "/" + remoteFileName);  InputStream in = new FileInputStream(f);  ftpClient.storeFile(remoteFileName, in);  in.close();  uploadResult = "文件" + remoteFileName + "上傳成功!";f.delete(); // 刪除本地臨時文件} else {  uploadResult =  "文件" + remoteFileName + "上傳失敗!";}  return uploadResult;} catch (Exception e) {  e.printStackTrace();  return uploadResult+"錯誤源: "+e.getMessage();}finally{  try {  ftpClient.disconnect();  } catch (IOException e) {  e.printStackTrace();  }  }  }  /*** 文件寫出到本地* @param fileName 文件名* @param fileContext 文件內容* @param writeTempFielPath 本地存儲路徑* @return*/public static String write(String fileName, String fileContext,  String writeTempFielPath) {  String result = "寫出成功 !";try {  File f = new File(writeTempFielPath + "/" + fileName);  if(!f.exists()){  if(!f.createNewFile()){  result = "文件不存在,創建失敗 !";}  }  BufferedWriter bw = new BufferedWriter(new FileWriter(f, true));  bw.write(fileContext.replaceAll("\n", "\r\n"));  bw.flush();  bw.close();  return result;  } catch (Exception e) {  result = "寫出失敗 !";e.printStackTrace();  return result;  }  }  /** * 從FTP服務器下載文件 * @param ftpHost FTP服務器IP * @param port FTP服務器端口 * @param username FTP登錄賬號 * @param password FTP登錄密碼 * @param remotePath FTP服務器上的相對路徑 * @param fileName 要下載的文件名 * @param localPath 下載后保存到本地的路徑 * @return */public static String downFile(String ftpHost, int port,String username, String password,String remotePath,String fileName,String localPath) { String result = "下載失敗 !"; FTPClient ftp = new FTPClient(); try { int reply; ftp.connect(ftpHost, port); ftp.login(username, password); // 登錄 reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return "服務連接失敗 !"; } ftp.changeWorkingDirectory(remotePath); // 轉移到FTP服務器目錄 FTPFile[] fs = ftp.listFiles(); boolean flag = false; // 下載文件不存在for(FTPFile ff:fs){ if(ff.getName().equals(fileName)){ File localFile = new File(localPath+"/"+ff.getName()); OutputStream is = new FileOutputStream(localFile); ftp.retrieveFile(ff.getName(), is); is.close(); flag = true;} }ftp.logout(); if(!flag){result = "文件: "+fileName+"不存在 !"; }else{result = "下載成功 !"; }} catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) {} } } return result; }}  </strong>

?

?

?

upload方法可以用這個方法代替,直接上傳整個文件,而不作用把文件內容作為參數,此方法主體代碼來自網絡:

?

package ftp;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import org.apache.commons.net.ftp.FTPClient;
/*** 文件上傳替換方法 **/
public class FtpUpToo {private static FTPClient ftpClient = null;  /** * ftp上傳文件* @param targetFname 生成目標文件 * @return true||false */  public static boolean uploadFile(String targetFname){  int ftpPort = 0;  String ftpUserName = "";  // ftp服務賬號String ftpPassword = "";  // ftp服務密碼String ftpHost = "";  // ftp服務ipString ftpPath = "";  // ftp服務器上存放文件的路徑String writeTempFielPath = "";  // 文件在本地的路徑String proName = "ftp.properties"; // 配置文件名try {// 配置文件一定要和本類放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  if (in == null) {  throw new Exception("配置文件"+proName+"讀取失敗 !");} Properties properties = new Properties();  properties.load(in);  ftpUserName = properties.getProperty("ftpUserName");  ftpPassword = properties.getProperty("ftpPassword");  ftpHost = properties.getProperty("ftpHost");  ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  .intValue();  ftpPath = properties.getProperty("ftpPath");  writeTempFielPath = properties.getProperty("writeTempFielPath"); } catch (Exception e) {e.printStackTrace();}    boolean flag = false;  ftpClient = FtpUtil.getFTPClient(ftpHost, ftpPassword, ftpUserName, ftpPort); if( ftpClient!=null ){  File srcFile = new File(writeTempFielPath+"/JiangYuUp.csv");   FileInputStream fis = null;  try {  fis  = new FileInputStream(srcFile);  //設置上傳目錄   ftpClient.changeWorkingDirectory(ftpPath);  ftpClient.setBufferSize(1024);   ftpClient.setControlEncoding("GBK");   //設置文件類型(二進制)   ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  //上傳  flag = ftpClient.storeFile(targetFname, fis);   } catch (Exception e) {  e.printStackTrace();  closeCon();  }finally{  try {fis.close();System.out.println("運行結束!----");} catch (IOException e) {e.printStackTrace();}}  }  return flag;  }/** * 銷毀ftp連接*/  public static void closeCon(){  if(ftpClient !=null){  if(ftpClient.isConnected()){  try {  ftpClient.logout();  ftpClient.disconnect();  } catch (IOException e) {  e.printStackTrace();  }   }  }  }  }

?

?

?

?

?

四、測試類:

?

?

<strong>package ftp;import java.io.InputStream;
import java.util.Properties;public class FtpTest {  public static void main(String[] args) {  new FtpTest().test();}  private void test(){int ftpPort = 0;  String ftpUserName = "";  // ftp服務賬號String ftpPassword = "";  // ftp服務密碼String ftpHost = "";  // ftp服務ipString ftpPath = "";  // ftp服務器上存放文件的路徑String writeTempFielPath = "";  // 文件在本地的路徑String proName = "ftp.properties"; // 配置文件名try {  // 配置文件一定要和本類放在同一包下才能找到 InputStream in = FtpUtil.class.getClassLoader().getResourceAsStream(proName);  if (in == null) {  throw new Exception("配置文件"+proName+"讀取失敗 !");} Properties properties = new Properties();  properties.load(in);  ftpUserName = properties.getProperty("ftpUserName");  ftpPassword = properties.getProperty("ftpPassword");  ftpHost = properties.getProperty("ftpHost");  ftpPort = Integer.valueOf(properties.getProperty("ftpPort"))  .intValue();  ftpPath = properties.getProperty("ftpPath");  writeTempFielPath = properties.getProperty("writeTempFielPath");  // 下載String result = FtpUtil.downFile(ftpHost, ftpPort, ftpUserName, ftpPassword,ftpPath, "JiangYu.csv", writeTempFielPath);  // JiangYu.csv:下載文件的名稱System.out.println("文件下載結果為:" + result);  // 上傳ftpPath = ftpPath + "/" + "JiangYu.csv";  // JiangYu.csv:上傳文件的名稱FtpUtil.upload(ftpPath, ftpUserName, ftpPassword, ftpHost, ftpPort, "這里是文件內容", writeTempFielPath);  } catch (Exception e) {  e.printStackTrace();  }  }
}  </strong>

?

?

注: ?測試類運行后下載成功的文件 和 上傳時的臨時文件是一樣的名字,會被上傳成功后刪除臨時文件操作所刪除。

?建議上傳和下載分開測試。

?

五、 上傳、下載結果:

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451137.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongDB集合文檔操作符

一、MongoDB - 連接1.啟動 MongoDB 服務只需要在 MongoDB 安裝目錄的 bin 目錄下執行 mongod 即可執行啟動操作后&#xff0c;mongodb 在輸出一些必要信息后不會輸出任何信息&#xff0c;之后就等待連接的建立&#xff0c;當連接被建立后&#xff0c;就會開始打印日志信息。可以…

LIMIT M,N分頁性能優化方案

利用子查詢優化 說明: MySQL 并不是跳過 offset 行&#xff0c;而是取 offsetN 行&#xff0c;然后返回放棄前 offset 行&#xff0c;返回 N 行&#xff0c;那當 offset 特別大的時候&#xff0c;此時使用limit m,n效率就非常的低下。想要提升性能要么控制返回的總頁數&#…

PHP獲取文件后綴名

PHP獲取文件后綴名是PHP學習者常見的一種操作&#xff0c;無論是在面試過程中還是PHP新手自學中。PHP獲取文件后綴名都是很普遍的需要掌握的一個知識點。下面我們就給大家總結介紹PHP獲取文件擴展名也就是后綴名的兩種方法&#xff01;一、通過pathinfo首先大家應該知道pathinf…

Web Service 簡單實例(java 版本) ,IDE自動生成客戶端代碼方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、客戶端工程 jar 包 &#xff1a; 二、1. 服務端&#xff1a;( new 一個web service project ) package com;import javax.jws.…

最佳Linux服務器發行版

一款Linux發行版就如同一件衣服一樣&#xff0c;適合自己的才是最好的選擇。 對大型企業而言&#xff0c;當然首選Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技術支持服務&#xff0c;而且在我們周圍&#xff0c;非常容易找到持有Red Hat認證的技…

在線代碼編輯器 Codemirror 的輕量級 React 組件

代碼編輯器 CodeMirror 的輕量級 React 組件 demo uiw-react.github.io/react-codem… 特性: ? 自動根據 mode 配置加載 mode 文件。 ? 快速簡單的配置 API。 安裝 npm install uiw/react-codemirror --save 復制代碼使用 import CodeMirror from uiw/react-codemirror; impo…

「機械」4大傳動方式優劣對比:機械、電氣、氣壓、液壓

傳動方式有很多種。目前應用比較多的四大類傳動方式&#xff08;機械、電氣、液壓和氣壓&#xff09;中&#xff0c;沒有一種動力傳動是十全十美的。今天跟大家分享4種傳動方式的優劣對比。 一. 機械傳動 1. 齒輪傳動 齒輪傳動是機械傳動中應用最廣的一種傳動形式。它的傳動比較…

一次性獲取多個oracle序列的值,實現關聯表多數據的批量insert

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 業務 要求批量導入不小于10W條數據到 user 表&#xff0c;但是user表在 insert 每條數據的同時要 insert 一條對應數據到 customer表…

開始使用C++11的9個理由

如果你的代碼工作正常并且表現良好&#xff0c;你可能會想知道為什么還要使用C 11。當然了&#xff0c;使用用最新的技術感覺很好&#xff0c;但是事實上它是否值得呢&#xff1f; 在我看來&#xff0c;答案毫無疑問是肯定的。我在下面給出了9個理由&#xff0c;它們分為兩類&a…

MySQL批量update數據(更新的數據值不同)

(一)純mysql: ?UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis寫法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在項目開發的時候&#xff0c;接口聯調的時候一般都是同域名下&#xff0c;且不存在跨域的情況下進行接口聯調&#xff0c;但是當我們現在使用vue-cli進行項目打包的時候&#xff0c;我們在本地啟動服務器后&#xff0c;比如本地開發服務下是 http://localhost:8080 這樣的訪問…

AMQP 協議介紹

RabbitMQ 是遵從AMQP 協議的&#xff0c; 換句話說&#xff0c; RabbitMQ 就是AMQP 協議的Erlang 的實現(當然RabbitMQ 還支持STOMP2 、MQTT3 等協議) 0 AMQP 的模型架構和RabbitMQ 的模型架構是一樣的&#xff0c;生產者將消息發送給交換器&#xff0c;交換器和隊列綁定。當生…

關聯表多數據的批量insert (批量導入,測試19W條數據用時46秒)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、業務需求 &#xff1a;作多個批量導入 &#xff0c;根據業務不同&#xff0c;每條數據導入前作各種驗證&#xff0c; 導入后提示驗證…

Java已死?九百萬程序員說不

Java沒死&#xff0c;事實上它擁有足夠的能量讓你的應用跑起來。那些對Java吹毛求疵人頻繁地聚焦在一些小眾問題上&#xff0c;總是和其他技術或者語言做些不公平的對比&#xff0c;這些語言并沒有像Java一樣得到廣泛應用及長遠的歷史。 現在的小孩都能學Java&#xff0c;它在…

Linux SSH遠程管理故障如何排查?

SSH遠程管理故障排查方案&#xff1a;1、檢測兩個機器是否暢通兩個機器之間是否暢通&#xff0c;查看物理鏈路是否有問題(網線網卡、IP是否正確)第1步&#xff1a;物理鏈路是否暢通&#xff0c;比喻為“高速公路是否暢通”ping 排查客戶端到服務端的線路問題&#xff0c;ping是…

CSS中position的absolute和relative用法

static: HTML元素的默認定位方式absolute: 將對象從文檔流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等屬性進行絕對定位。而其層疊通過z-index屬性定義。絕對定位的元素的位置相對于最近的已定位父元素&#xff0c;如果元素沒有已定位的父…

Spring HttpMessageNotReadableException異常

&#xff08;一&#xff09;現象 我們在進行服務間的rpc調用時&#xff0c;可能會遇到org.springframework.http.converter.HttpMessageNotReadableException異常。 其具體報錯如下&#xff1a; {"timestamp": 1456043810789,"status": 400,"error…

解決 -- java 調用webservice 服務端收到參數為null

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的客戶端和服務端都寫的很簡單&#xff0c;只是調用服務的時候&#xff0c; 服務端得不到參數&#xff0c;后來發現只改一個地方就可…

fastJson性能測試

測試裝備&#xff1a; mac pro 6核12線程 測試代碼&#xff1a; &#xff08;1&#xff09;序列化對象&#xff1a; import lombok.Data;Data public class User {int id;String name;int age;String address; } &#xff08;2&#xff09;序列化邏輯&#xff1a; import…