java使用Apache工具集實現ftp檔案傳輸
本文主要介紹如何使用Apache工具集commons-net提供的ftp工具實現向ftp伺服器上傳和下載檔案。
一、準備
需要引用commons-net-3.5.jar包。
- 使用maven匯入:
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.5</version>
</dependency>
- 手動下載:
二、連線FTP Server
/**
* 連線FTP Server
* @throws IOException
*/
public static final String ANONYMOUS_USER="anonymous";
private FTPClient connect(){
FTPClient client = new FTPClient();
try{
//連線FTP Server
client.connect(this.host, this.port);
//登陸
if(this.user==null||"".equals(this.user)){
//使用匿名登陸
client.login(ANONYMOUS_USER, ANONYMOUS_USER);
}else{
client.login(this.user, this.password);
}
//設定檔案格式
client.setFileType(FTPClient.BINARY_FILE_TYPE);
//獲取FTP Server 應答
int reply = client.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
client.disconnect();
return null;
}
//切換工作目錄
changeWorkingDirectory(client);
System.out.println("===連線到FTP:"+host+":"+port);
}catch(IOException e){
return null;
}
return client;
}
/**
* 切換工作目錄,遠端目錄不存在時,建立目錄
* @param client
* @throws IOException
*/
private void changeWorkingDirectory(FTPClient client) throws IOException{
if(this.ftpPath!=null&&!"".equals(this.ftpPath)){
boolean ok = client.changeWorkingDirectory(this.ftpPath);
if(!ok){
//ftpPath 不存在,手動建立目錄
StringTokenizer token = new StringTokenizer(this.ftpPath,"\\//");
while(token.hasMoreTokens()){
String path = token.nextToken();
client.makeDirectory(path);
client.changeWorkingDirectory(path);
}
}
}
}
/**
* 斷開FTP連線
* @param ftpClient
* @throws IOException
*/
public void close(FTPClient ftpClient) throws IOException{
if(ftpClient!=null && ftpClient.isConnected()){
ftpClient.logout();
ftpClient.disconnect();
}
System.out.println("!!!斷開FTP連線:"+host+":"+port);
}
host:ftp伺服器ip地址
port:ftp伺服器埠
user:登陸使用者
password:登陸密碼
登陸使用者為空時,使用匿名使用者登陸。
ftpPath:ftp路徑,ftp路徑不存在時自動建立,如果是多層目錄結構,需要迭代建立目錄。
三、上傳檔案
/**
* 上傳檔案
* @param targetName 上傳到ftp檔名
* @param localFile 本地檔案路徑
* @return
*/
public boolean upload(String targetName,String localFile){
//連線ftp server
FTPClient ftpClient = connect();
if(ftpClient==null){
System.out.println("連線FTP伺服器["+host+":"+port+"]失敗!");
return false;
}
File file = new File(localFile);
//設定上傳後文件名
if(targetName==null||"".equals(targetName))
targetName = file.getName();
FileInputStream fis = null;
try{
long now = System.currentTimeMillis();
//開始上傳檔案
fis = new FileInputStream(file);
System.out.println(">>>開始上傳檔案:"+file.getName());
boolean ok = ftpClient.storeFile(targetName, fis);
if(ok){//上傳成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format(">>>上傳成功:大小:%s,上傳時間:%d秒", formatSize(file.length()),times/1000));
}else//上傳失敗
System.out.println(String.format(">>>上傳失敗:大小:%s", formatSize(file.length())));
}catch(IOException e){
System.err.println(String.format(">>>上傳失敗:大小:%s", formatSize(file.length())));
e.printStackTrace();
return false;
}finally{
try{
if(fis!=null)
fis.close();
close(ftpClient);
}catch(Exception e){}
}
return true;
}
四、下載檔案
/**
* 下載檔案
* @param localPath 本地存放路徑
* @return
*/
public int download(String localPath){
// 連線ftp server
FTPClient ftpClient = connect();
if(ftpClient==null){
System.out.println("連線FTP伺服器["+host+":"+port+"]失敗!");
return 0;
}
File dir = new File(localPath);
if(!dir.exists())
dir.mkdirs();
FTPFile[] ftpFiles = null;
try{
ftpFiles = ftpClient.listFiles();
if(ftpFiles==null||ftpFiles.length==0)
return 0;
}catch(IOException e){
return 0;
}
int c = 0;
for(int i=0;i<ftpFiles.length;i++){
FileOutputStream fos = null;
try{
String name = ftpFiles[i].getName();
fos = new FileOutputStream(new File(dir.getAbsolutePath()+File.separator+name));
System.out.println("<<<開始下載檔案:"+name);
long now = System.currentTimeMillis();
boolean ok = ftpClient.retrieveFile(new String(name.getBytes("UTF-8"),"ISO-8859-1"), fos);
if(ok){//下載成功
long times = System.currentTimeMillis() - now;
System.out.println(String.format("<<<下載成功:大小:%s,上傳時間:%d秒", formatSize(ftpFiles[i].getSize()),times/1000));
c++;
}else{
System.out.println("<<<下載失敗");
}
}catch(IOException e){
System.err.println("<<<下載失敗");
e.printStackTrace();
}finally{
try{
if(fos!=null)
fos.close();
close(ftpClient);
}catch(Exception e){}
}
}
return c;
}
格式化檔案大小
private static final DecimalFormat DF = new DecimalFormat("#.##");
/**
* 格式化檔案大小(B,KB,MB,GB)
* @param size
* @return
*/
private String formatSize(long size){
if(size<1024){
return size + " B";
}else if(size<1024*1024){
return size/1024 + " KB";
}else if(size<1024*1024*1024){
return (size/(1024*1024)) + " MB";
}else{
double gb = size/(1024*1024*1024);
return DF.format(gb)+" GB";
}
}
五、測試
public static void main(String args[]){
FTPTest ftp = new FTPTest("192.168.1.10",21,null,null,"/temp/2016/12");
ftp.upload("newFile.rar", "D:/ftp/TeamViewerPortable.rar");
System.out.println("");
ftp.download("D:/ftp/");
}
結果
===連線到FTP:192.168.1.10:21
>>>開始上傳檔案:TeamViewerPortable.rar
>>>上傳成功:大小:5 MB,上傳時間:3秒
!!!斷開FTP連線:192.168.1.10:21
===連線到FTP:192.168.1.10:21
<<<開始下載檔案:newFile.rar
<<<下載成功:大小:5 MB,上傳時間:4秒
!!!斷開FTP連線:192.168.1.10:21
相關推薦
java使用Apache工具集實現ftp檔案傳輸
本文主要介紹如何使用Apache工具集commons-net提供的ftp工具實現向ftp伺服器上傳和下載檔案。 一、準備 需要引用commons-net-3.5.jar包。 使用ma
python基於併發與socket實現遠端檔案傳輸程式
FTP程式 Client: * bin/start.py 程式入口 * conf/配置檔案存放 * core/ * auth.py 登陸,註冊以及上傳下載檢視當前資料夾下檔案以及刪除功能存放 * cline.py 與服務端通訊 * home 本地使用者目錄 Server: * bin/
C#實現FTP檔案的上傳、下載功能、新建目錄以及檔案的刪除
轉載至:https://www.cnblogs.com/zhenzaizai/p/7434669.html using System; using System.Collections.Generic;
FTP檔案傳輸服務
FTP檔案傳輸服務 FTP連線及傳輸模式 1 控制連線:TCP 21,用於傳送FTP命令資訊 2 資料連線:TCP 20,用於上傳、下載資料 3 資料連線建立型別:
Jquery+Django 實現 CORS 檔案傳輸
場景描述 前端處理過程 後端處理過程 場景描述 遇到這樣一個開發場景,伺服器A作為一個web server(可以看做master)而伺服器B 作為
如何實現高速檔案傳輸?用一個比喻向你說清楚
日常工作中,我們經常要給外地分/總公司的同事、眾多合作伙伴傳輸檔案。檔案稍微大一點經常傳輸速度很慢,如果要的不急還能忍受,如果在限定時間內很快傳給對方,這種龜速傳輸會讓人崩潰。 怎麼解決這個問題呢? 高速檔案傳輸可以簡單具象成三個方面:修一條高速路、修一條不堵車的高速路、買輛重卡拉貨
C#實戰027:socket實現大檔案傳輸
前面寫了一個單檔案傳輸的,後來發現當傳送的檔案大於設定的快取空間時,檔案就會出現丟包的現象,導致檔案無法使用,所以為了適應大檔案的傳輸,這裡我將程式碼進行了下修改,實現大檔案傳輸。 不過socket實現大檔案傳輸有個缺點,由於傳輸過程是通過位元組快取傳送,接受也是讀寫位元組,導致整個傳輸過
C#實戰026:socket實現單檔案傳輸
實現簡單的資訊通訊,接下來我們要繼續來是實現檔案的傳輸,同樣這次先試試單個簡單的小檔案傳輸,首先先說說原理,這次我們先對檔案進行檔名獲取,將檔名以資訊傳輸的形式的先傳遞給服務端,目的是讓伺服器知道我們要傳送的檔名及檔案型別,接著再來發送檔案,這裡我們需要將檔案轉化成位元組
多執行緒實現ftp 檔案下載
1 需求: 某個介面的紀錄在ftp 伺服器上,以類別/日期/時間.來存放檔案,而一天可能會產生幾百個檔案,需要下載檔案進行儲存 問題: 1. 這個時候如果同時,要拿幾個類別,某個時間段的資料,就要瘋狂下載了,如果是單執行緒的 2. ftp 一般只允許同一個使用者名稱,同時有幾個程
Java實現FTP檔案的上傳和下載
一、前言: 最近剛好需要實現這個功能:實現ftp的上傳和下載。在網上找了下資料,總結了下。直接上程式碼: 二、程式碼示例: 首先使用到的maven依賴: <dependency> <groupId>commons-net</gro
Java 實現ftp 檔案上傳、下載和刪除
本文利用apache ftp工具實現檔案的上傳下載和刪除。具體如下: 1、下載相應的jar包 commons-net-1.4.1.jar 2、實現程式碼如下: public class FtpUtils { //ftp伺服器地址
網路程式設計實驗三——TCP實現跨平臺檔案傳輸
一、實驗目的 1.在循環面向連線的程式基礎上,利用tcp完成linux和windows平臺的檔案傳輸。 2.對伺服器程式進行合理的封裝優化實驗步驟。 二、實驗分析 Linux伺服器: 1.首先,建立套接字,並將其繫結到提供服務的埠上,設定為被動模式,將這幾步進
FTP檔案傳輸協議詳解
FTP 是File Transfer Protocol(檔案傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制檔案的雙向傳輸。同時,它也是一個應用程式(Application)。基於不同的作業系統有不同的FTP應用程式,而所有這些應用
java 中 FtpClient 實現 FTP 檔案上傳、下載
package ftp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWrit
QT實現TCP檔案傳輸
傳輸過程中TCP的使用見上一個帖子,介紹一下檔案傳輸 //主要用到了以下標頭檔案 #include <QFileDialog> //該函式返回對話方塊下選擇檔案目錄 QString filePath=QFileDialog::getOpenFileName(this,"open","
網路程式設計——3.TCP/UDP實現跨平臺檔案傳輸
一、實驗目的 在上次檔案傳輸的程式基礎上,利用循環面向連線、迴圈無連線方式完成linux和windows平臺的檔案傳輸,並完成客戶端、伺服器端程式碼的封裝。 二、實驗分析 1.使用TCP實現 在上次實驗基礎上,使用tcp_server.c的程式碼
第二彈——SSH遠端連線和FTP檔案傳輸
上一篇介紹如何獲得一臺阿里雲的雲伺服器ECS,拿到服務氣候,我們就需要進行一些操作了,畢竟伺服器不在身旁,你不能直接訪問伺服器,所以你必須要與伺服器建立連線這樣伺服器才算是你的。所以這篇就講講ssh遠端連線和ftp檔案傳輸。 SSH遠端連線: 其實,我們
socket實現大型檔案傳輸
最近需要做網路傳輸的專案,需要實現較大檔案的傳輸。在網上收集了不少資料,但是各有各的做法,尤其是關於檔案自動接收這一塊不太清楚。 經過圖書館查閱後還是找到了一種解決辦法,雖然做的不太專業,但是思路比較精簡、清晰,也希望能給大家尤其是剛學習socket套接字的人
嵌入式開發板iTOP-4412實現TFTP檔案傳輸
平臺:iTOP-4412開發板 本文講解如何通過 TFTP 來實現線上除錯應用程式。 TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議) ,是一個基於 UDP 協議實現的用於在客戶機和伺服器之間進行簡單檔案傳輸的協議,適合於開銷不大、
FTP檔案傳輸協議兩種模式-主動模式和被動模式
TCP/IP協議中,FTP標準命令TCP埠號為21,Port方式資料埠為20。FTP協議的任務是從一臺計算機將檔案傳送到另一臺計算機,它與這兩臺計算機所處的位置、聯接的方式、甚至是是否使用相同的作業系統無關。假設兩臺計算機通過ftp協議對話,並且能訪問Internet, 你可以用ftp命令來傳輸檔案。每種作