1. 程式人生 > >Ftp上傳下載檔案,並能自定義進度條展示(FtpClient)

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 ftpzip檔案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執行rzsz命令下載檔案

最近因為學習的需要,第一次接觸了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程式設計,記一下自己寫的第一個指令