Ftp上傳下載檔案,並能自定義進度條展示(FtpClient)
前一段時間,自己寫了一個java專案釋出在一個免費的java平臺上但是該平臺給專案的是虛擬路徑並不能上傳檔案。後來想到應用ftp作為上傳檔案的儲存器。
ftp上傳的工具類有sun(sun.net.*)和apache(org.apache.commons.net.ftp.* 這個需要在專案中載入commons-net-1.4.1.jar包)。這次我提供的是基於FtpClient(sun)實現的上傳檔案,因為用FTPClient(apache)想要強行加入上傳檔案的速度檢測比較麻煩,暫時沒有處理以後在整理。
下面說一下我的實現思路:UploadFtp1.java 負責上傳和下載的方法實現,ExStreams.java 重寫其中的方法copy()把檔案讀取的迴圈中新增上上傳的監聽 ,UploadProgressListener.java 進度的實體類
UploadFtp1.java
package upload; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.net.TelnetInputStream; import sun.net.TelnetOutputStream; public class UploadFtp1 { private sun.net.ftp.FtpClient client=null; private String strServerAddr=""; private int iServerPort=0; private String strUserName=""; private String strUserPwd=""; // 監測連線是否正常 public boolean CheckConn(){ boolean bRet=false; try{ client.pwd(); bRet=true; }catch(IOException ex){ bRet=false; } return bRet; } //設定資料的傳輸格式為二進位制,如果是文字以外的資料如圖片應該用此方法 private boolean Binary(){ boolean bRet=false; try{ client.binary(); bRet=true; }catch(IOException ex){ bRet=false; } return bRet; } //單位元組字元編碼方案,用於基於文字的資料 private boolean Ascii(){ boolean bRet=false; try{ client.ascii(); bRet=true; }catch(IOException ex){ bRet=false; }return bRet; } public boolean DisConnect(){ boolean bRet=false; try{ client.closeServer(); bRet=true; }catch(IOException ex){ bRet=false; } return bRet; } /** * 用書上傳本地檔案到ftp伺服器上 * @param strSrcFile 上傳檔案的本地路徑 * @param strDestFile 上傳到ftp的檔案路徑 * @return */ public boolean PutFile(String strSrcFile,String strDestFile){ boolean bRet=false; try{ Binary(); TelnetOutputStream fput=client.put(strDestFile); BufferedOutputStream out = new BufferedOutputStream(fput); File fi = new File(strSrcFile); InputStream srcFile = new FileInputStream(fi); BufferedInputStream in = new BufferedInputStream(srcFile); UploadProgressListener listener = new UploadProgressListener(); ExStreams.copy(in, out,in.available(),true,listener); //一定要關閉檔案流 in.close(); out.close(); System.out.print("put file suc from "+strSrcFile+" to "+strDestFile+"\r\n"); } catch (IOException ex){ bRet=false; ex.printStackTrace(); } return bRet; } /** * 從ftp上下載所需要的檔案 * @param strSrcFile 在ftp上路徑及檔名 * @param strDestFile 要儲存的本地的路徑 * @return */ public boolean GetFile(String strSrcFile,String strDestFile){ boolean bRet=false; try{ Binary(); TelnetInputStream fget=client.get(strSrcFile); //為了讀取ftp該檔案的大小,為了計算下載速度和百分比 int fileSize = -1; client.sendServer("SIZE "+strSrcFile+"\r\n"); int res = client.readServerResponse();//z注意:這裡的組合使用是必須得 sendServer 後到 readServerResponse if(res==213){ String msg= client.getResponseString(); try{ fileSize = Integer.parseInt(msg.substring(3).trim()); } catch(Exception ex){;} } BufferedInputStream in = new BufferedInputStream(fget); File fi = new File(strDestFile); OutputStream srcFile = new FileOutputStream(fi); BufferedOutputStream out = new BufferedOutputStream(srcFile); UploadProgressListener listener = new UploadProgressListener(); listener.setFileName(strDestFile); ExStreams.copy(in, out,fileSize, true,listener); //一定要關閉檔案流 in.close(); out.close(); System.out.print("get file suc from "+strSrcFile+" to "+strDestFile+"\r\n"); } catch (IOException ex){ bRet=false; ex.printStackTrace(); } return bRet; } /** * 連線ftp伺服器 * @param ServerAddr * @param ServerPort * @param UserName * @param UserPwd * @return */ public boolean Connect(String ServerAddr,int ServerPort,String UserName,String UserPwd){ boolean bRet=false; client=new sun.net.ftp.FtpClient(); this.strServerAddr=ServerAddr; this.iServerPort=ServerPort; this.strUserName=UserName; this.strUserPwd=UserPwd; try{ client.openServer(strServerAddr,iServerPort); client.login(strUserName, strUserPwd); System.out.print("connect succeed\n"); bRet=true; } catch (IOException ex) { ex.printStackTrace(); bRet=false; } return bRet; } /** * ftp連線一致連 直到連線成功。 * @return */ public boolean ConnectTillSuc(){ return this.ConnectTillSuc(this.strServerAddr, this.iServerPort, this.strUserName, this.strUserPwd); } // 連線,直到成功 public boolean ConnectTillSuc(String ServerAddr,int ServerPort,String UserName,String UserPwd){ while(!this.Connect(ServerAddr, ServerPort, UserName, UserPwd)){ try { System.out.print("connect failed,retry...\n"); Thread.sleep(3000); }catch (InterruptedException e) { e.printStackTrace(); } } return true; } public static void main(String[] args) throws IOException, InterruptedException { UploadFtp1 client=new UploadFtp1(); boolean b=client.ConnectTillSuc("",21,"",""); //client.PutFile("D:\\code.jar", "/test/1344439.jar"); client.GetFile("/test/1344469.jar", "D:\\4044-1.jar"); client.DisConnect(); } }
ExStreams.java
package upload; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ExStreams { public static long copy(InputStream pInputStream, OutputStream pOutputStream,long size,boolean pClose,UploadProgressListener uploadListener) throws IOException { return copy(pInputStream, pOutputStream,size, pClose,new byte[8192],uploadListener); } public static long copy(InputStream pIn, OutputStream pOut,long size,boolean pClose,byte[] pBuffer,UploadProgressListener uploadListener) throws IOException { OutputStream out = pOut; InputStream in = pIn; try { long total = 0L; int res; while (true) { res = in.read(pBuffer); if (res == -1) { break; } if (res > 0) { total += res; if (out != null) { out.write(pBuffer, 0, res); System.out.println("檔案的大小"+size+"讀取的大小"+total); uploadListener.update(total, size, 0); } } } if (out != null) { if (pClose) out.close(); else { out.flush(); } out = null; } in.close(); in = null; return total; } finally { if (in != null) try { in.close(); } catch (Throwable t) { } if ((pClose) && (out != null)) try { out.close(); } catch (Throwable t) { } } } }
UploadProgressListener.java
package upload;
import java.io.Serializable;
public class UploadProgressListener implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private volatile long bytesRead = 0L;
private volatile long contentLength = 0L;
private String fileName = "";
private long megaBytes = -1L;
public void update(long aBytesRead, long aContentLength, int anItem)
{
this.bytesRead = (aBytesRead / 1024L);
this.contentLength = (aContentLength / 1024L);
if (this.contentLength == 0L) {
this.contentLength = 1L;
}
long mBytes = aBytesRead / 1048576L;
if (this.megaBytes == mBytes) {
return;
}
this.megaBytes = mBytes;
System.out.println("上傳或者下載檔案:" + this.fileName + ",檔案的大小:" + aBytesRead + "/" + aContentLength);
}
public long getBytesRead() {
return this.bytesRead;
}
public long getContentLength() {
return this.contentLength;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
相關推薦
Ftp上傳下載檔案,並能自定義進度條展示(FtpClient)
前一段時間,自己寫了一個java專案釋出在一個免費的java平臺上但是該平臺給專案的是虛擬路徑並不能上傳檔案。後來想到應用ftp作為上傳檔案的儲存器。 ftp上傳的工具類有sun(sun.net.*)和apache(org.apache.commons.net.ftp.*
window ftp上傳zip檔案,linux不能用unzip解壓問題
http://blog.itpub.net/22608279/viewspace-660343/ file *.zip 在windows cmd命令下ftp ,put檔案 到遠端伺服器上 ftp> put "F:\oracle 10.2 for linux edit
Windows環境在cmd中使用ftp上傳下載檔案 檢視端口占用情況
cmd使用 端口占用 ftp上傳下載檔案 上傳 下載 端口占用 有時候在執行一些開發工具的時候經常會碰到埠被佔用的情況,比如adb執行埠被其它流氓軟體佔用,解決方法如下 開啟執行 彈窗,輸入cm
php使用新浪雲Storage儲存上傳下載檔案,建立bucket、Bucket 操作、Object 上傳操作,Object 下載操作,Object 刪除操作、Object 複製操作,生成一個外網能夠訪
<?php //新浪雲 Storage PHP use use sinacloud\sae\Storage as Storage; // 方法一:在新浪雲執行環境中時可以不傳認證資訊,預設會從應用的環境變數中取 $s = new Storage();
Jquery+SpringMVC實現上傳Excel檔案,並批量匯入
1.前端程式碼 function alertUploadFile(){ //建立表單 var formData = new FormData(); var file = $("#upload").val(); console.log(file)
讀取FTP上的excel檔案,並寫入資料庫
今天遇到一些問題,需要從ftp上讀取一些excel檔案,並需要將excel中的資料寫入到資料庫,這樣就可以通過管理頁面檢視這些資料。 我將相關工作分為三步,1、從ftp上讀取相關檔案,並將excel檔案下載到本地。2、讀取
Shell指令碼實現FTP上傳下載檔案
Linux下使用Shell指令碼實現FTP自動上傳和下載檔案 登入FTP實現下載檔案功能 FTP伺服器:10.11.10.11 FTP路徑:Down 本地路徑: ./ 將檔案從FTP下載到本地的指令碼如下: 批量下載指令碼程式碼 #從
Java 實現Ftp上傳下載檔案
最近專案中需要實現將檔案先存放到ftp上,需要的時候再從ftp上下載,做的過程中碰到了問題,發現中文檔名的無法上傳到ftp上,ftp上的中文檔名的檔案下載不下來,幾番折騰,終於搞定了,記錄一下備忘。首先給工程新增maven依賴,pom.xml檔案中新增:<depende
使用POI實現上傳ecxel檔案,並讀取其中資料並存入資料庫
首先是檢視層 即 jsp<span style="font-size:14px;"><body> <h1>${err}</h1> <form
Python 操作FTP檔案,上傳下載檔案
#!C:/Python27 #coding=utf-8 from ctypes import * import os import sys import ftplib class myFtp: ftp = ftplib.FTP() bIsDir = F
檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的值?
一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:
初步使用github,並上傳下載檔案
使用GitHub需要先註冊GitHub的賬號,登陸進去 然後開始建立專案 start a project 建立完成,開始生成公私鑰,可以不必每次都要輸密碼 ssh-keygen -t rsa -C "[email protected]" //填寫email
Struts框架上傳下載檔案輔助類,簡單實現Struts上傳圖片以及下載
首先在看這篇文章的前提下,你得會用Struts框架,有一定的基礎瞭解,說白了瞭解怎麼搭建就行了,然後基本就能順利執行本篇文章的Demo,當然這個類不僅僅侷限於圖片上傳下載的,因為是自己用流寫的方法所以可以支援其他檔案上傳下載。
Windows下vagrant建立VirtualBox後,運用SecureCRT執行rz,sz命令上傳下載檔案
最近因為學習的需要,第一次接觸了vagrant。因為是Windows環境,所以通過cmd中以進去之後,也無法複製黏貼。 rz,sz便是Linux/Unix同Windows進行ZModem檔案傳輸的命令列工具。 windows端需要支援ZModem的telnet/
java實現FTP上傳下載:FTPClient類進行FTP上傳下載大檔案(包含導致假死現象)
介紹: FTPClient是一個強大的FTP上傳下載工具,可以實現各種方式的ftp檔案傳輸,可以支援上傳下載各種大檔案(已在實踐中使用),而且存在官網使使用者方便的使用這個工具等等。 1.首先,程式中設定ftp請求方式為被動模式,即程式去請求ftp伺服器,要求伺服器來
java+jsp程式碼實現從FTP伺服器上傳下載檔案
首先宣告一下。jsp從ftp伺服器上面下載檔案,有兩種方法1.直接給出檔案的地址 2.將檔案作為位元組流返回給瀏覽器 一 、先說第一種吧(這種發放很簡單)。 1.直接使用一個超連結:<a href='ftp://FTP使用者名稱:密碼@IP地址:埠號+ 後面是路徑 (
CentOS 安裝rz和sz命令,實現ftp上傳下載功能
lrzsz在linux裡可代替ftp上傳和下載。 windows 需要向centos伺服器上傳檔案,可直接在centos上執行命令yum -y install lrzsz 程式會自動安裝好,然後如你要下載者sz [找到你要下載的檔案] 如果你要上傳,者rz 瀏覽找到你
JavaWeb使用ftp上傳下載以及訪問檔案
主要就是把對ftp的訪問封裝成一個常用類就行了。首先是要學會怎麼Java怎麼用,我是將其封裝成我自己的一個工具包,這樣下次使用的時候就可以直接拿出來用了。package com.utils; import java.io.InputStream; /** * * @a
java利用jcraft實現和遠端伺服器互動,實現上傳下載檔案
git地址:https://github.com/fusugongzi/upLoadAndDownloadFile 第一步:引入maven支援,新增maven依賴 <!-- https://mvnrepository.com/artifact/com.jcraft
Linux使用Shell指令碼實現FTP自動下載檔案,並記錄下載檔案日誌
Linux使用Shell指令碼實現FTP自動下載檔案,並記錄下載檔案日誌 最近初學shell程式設計,記一下自己寫的第一個指令