C# 上傳本地檔案至ftp上的方法
.NET程式設計實現FTP上傳檔案
1.WebClient非同步上傳
關鍵知識說明:
WebClient類提供4個非同步上傳方法,使用方法都是差不多的.
WebClient.UploadDataAsync方法
將資料緩衝區上載到指定的資源
WebClient.UploadFileAsync方法
將指定的本地檔案上載到指定的資源
WebClient.UploadStringAsync方法
將指定的字串上載到指定的資源
WebClient.UploadValuesAsync方法
將指定的名稱/值集合上載到指定的資源
其中一個方法簽名如下:
public void UploadDataAsync (
Uri address,
string method,
byte[] data,
Object userToken
)
引數
address
接收資料的資源的URI
method
用於將檔案傳送到資源的HTTP方法。如果為空,則對於http預設值為POST,對於ftp預設值為STOR
data
要傳送到資源的資料緩衝
userToken
一個使用者定義物件,此物件將被傳遞給完成非同步操作時所呼叫的方法
若要在資料的上載完成時收到通知,需要實現WebClient.UploadDataCompleted事件,此事件在每次完成非同步資料上載操作時引發
總結WebClient非同步上傳實現步驟:
第一步:定義WebClient,設定各屬性
第二步:註冊完成事件UploadDataCompleted,以便完成上傳時回撥
第三步:呼叫UploadDataAsync方法開始非同步上傳檔案
第四步:上傳檔案完成回撥完成事件UploadDataCompleted定義的方法
//註冊完成事件,以便上傳完成時,收到通知request.UploadDataCompleted
string ftpUser = "a";
string ftpPassWord = "b";
request.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );
FileStream myStream = new FileStream ( @"D:\n.txt" , FileMode.Open , FileAccess.Read );
byte [ ] dataByte =
myStream.Read ( dataByte , 0 , dataByte.Length ); //寫到2進位制陣列中myStream.Close ( );
Uri uri = new Uri ( "ftp://ftp.dygs2b.com/n.txt" );
request.UploadDataAsync ( uri , "STOR" , dataByte , dataByte );
void request_UploadDataCompleted ( object sender , UploadDataCompletedEventArgs e )
{
//接收UploadDataAsync傳遞過來的使用者定義物件byte [ ] dataByte = ( byte [ ] ) e.UserState;
//AsyncCompletedEventArgs.Error屬性,獲取一個值,該值指示非同步操作期間發生的錯誤if ( e.Error == null )
{
MessageBox.Show ( string.Format ( "上傳成功!檔案大小{0}" , dataByte.Length ) );
}
else
{
MessageBox.Show ( e.Error.Message );
}
}
2.FtpWebRequest非同步上傳
使用FtpWebRequest物件向伺服器上載檔案,則必須將檔案內容寫入請求流,同步請求流是通過呼叫GetRequestStream方法,而非同步對應方法是BeginGetRequestStream和EndGetRequestStream方法.
其中BeginGetRequestStream方法簽名如下:
public override IAsyncResult BeginGetRequestStream (
AsyncCallback callback,
Object state
)
引數
callback
一個 AsyncCallback 委託,它引用操作完成時要呼叫的方法
state
一個使用者定義物件,其中包含該操作的相關資訊。當操作完成時,此物件會被傳遞給callback委託
必須呼叫EndGetRequestStream方法用來完成非同步操作。通常,EndGetRequestStream由callback所引用的方法呼叫。
總結FtpWebRequest非同步上傳實現步驟:
第一步:定義FtpWebRequest,並設定相關屬性
第二步:呼叫FtpWebRequest.BeginGetRequestStream方法,定義操作完成時要呼叫的方法EndGetResponseCallback,開始以非同步方式開啟請求的內容流以便寫入.
第三步:實現EndGetResponseCallback方法,在此方法中呼叫FtpWebRequest.EndGetRequestStream方法,結束由BeginGetRequestStream啟動的掛起的非同步操作,再把本地的檔案流資料寫到請求流(RequestStream)中,再 FtpWebRequest.BeginGetResponse方法,定義操作完成時要呼叫的方法EndGetResponseCallback,開始以非同步方式向FTP伺服器傳送請求並從FTP伺服器接收響應.
第四步:實現EndGetResponseCallback方法,在此方法中呼叫FtpWebRequest.EndGetResponse方法,結束由BeginGetResponse啟動的掛起的非同步操作.
//定義FtpWebRequest,並設定相關屬性FtpWebRequest uploadRequest = ( FtpWebRequest ) WebRequest.Create ( uri );
uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
string ftpUser = "a";
string ftpPassWord = "b";
uploadRequest.Credentials = new NetworkCredential ( ftpUser , ftpPassWord );
//開始以非同步方式開啟請求的內容流以便寫入uploadRequest.BeginGetRequestStream ( new AsyncCallback ( EndGetStreamCallback ) , uploadRequest );
private void EndGetStreamCallback ( IAsyncResult ar )
{
//使用者定義物件,其中包含該操作的相關資訊,在這裡得到FtpWebRequest FtpWebRequest uploadRequest = ( FtpWebRequest ) ar.AsyncState;
//結束由BeginGetRequestStream啟動的掛起的非同步操作
//必須呼叫EndGetRequestStream方法來完成非同步操作
//通常EndGetRequestStream由callback所引用的方法呼叫 Stream requestStream = uploadRequest.EndGetRequestStream ( ar );
FileStream fileStream = File.Open ( @"D:\n.txt" , FileMode.Open );
byte [ ] buffer = new byte [ 1024 ];
int bytesRead;
while ( true )
{
bytesRead = fileStream.Read ( buffer , 0 , buffer.Length );
if ( bytesRead == 0 )
break;
//本地的檔案流資料寫到請求流 requestStream.Write ( buffer , 0 , bytesRead );
}
requestStream.Close ( );
fileStream.Close ( );
//開始以非同步方式向FTP伺服器傳送請求並從FTP伺服器接收響應 uploadRequest.BeginGetResponse ( new AsyncCallback ( EndGetResponseCallback ) , uploadRequest );
} private void EndGetResponseCallback ( IAsyncResult ar )
{
FtpWebRequest uploadRequest = ( FtpWebRequest ) ar.AsyncState;
//結束由BeginGetResponse啟動的掛起的非同步操作 FtpWebResponse uploadResponse = ( FtpWebResponse ) uploadRequest.EndGetResponse ( ar );
MessageBox.Show ( uploadResponse.StatusDescription );
MessageBox.Show ( "Upload complete" );
}
C# ftp上傳ftp
/// <summary>
/// 上傳檔案
/// </summary> /
// <param name="fileinfo">需要上傳的檔案</param>
/// <param name="targetDir">目標路徑</param>
/// <param name="hostname">ftp地址</param> /
// <param name="username">ftp使用者名稱</param> /
// <param name="password">ftp密碼</param>
public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
{ //1. check target
string target;
if (targetDir.Trim() == "")
{ return; }
target = Guid.NewGuid().ToString();
//使用臨時檔名
string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
///WebClient webcl = new WebClient();
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
//設定FTP命令 設定所要執行的FTP命令,
//ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假設此處為顯示指定路徑下的檔案列表
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
//指定檔案傳輸的資料型別
ftp.UseBinary = true;
ftp.UsePassive = true; //告訴ftp檔案大小
ftp.ContentLength = fileinfo.Length;
//緩衝大小設定為2KB
const int BufferSize = 2048;
byte[] content = new byte[BufferSize - 1 + 1];
int dataRead; //開啟一個檔案流 (System.IO.FileStream) 去讀上傳的檔案
using (FileStream fs = fileinfo.OpenRead())
{
try { //把上傳的檔案寫入流
{ do
{ //每次讀檔案流的2KB
dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); }
while (!(dataRead < BufferSize)); rs.Close(); } }
catch (Exception ex) { } finally { fs.Close(); } }
ftp = null; //設定FTP命令
ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名
ftp.RenameTo = fileinfo.Name; try { ftp.GetResponse(); }
catch (Exception ex)
{
ftp = GetRequest(URI, username, password); ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //刪除
ftp.GetResponse(); throw ex; } finally
{
//fileinfo.Delete(); } // 可以記錄一個日誌 "上傳" + fileinfo.FullName + "上傳到" + "FTP://" + hostname + "/" + targetDir + "/" + fileinfo.Name + "成功." );
ftp = null;
#region
/***** *FtpWebResponse * ****/ //FtpWebResponse ftpWebResponse = (FtpWebResponse)ftp.GetResponse();
#endregion
}
/// <summary> /// 下載檔案 /// </summary> /// <param name="localDir">下載至本地路徑</param> /// <param name="FtpDir">ftp目標檔案路徑</param> /// <param name="FtpFile">從ftp要下載的檔名</param> /// <param name="hostname">ftp地址即IP</param> /// <param name="username">ftp使用者名稱</param> /// <param name="password">ftp密碼</param> public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password) { string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile; string tmpname = Guid.NewGuid().ToString(); string localfile = localDir + @"\" + tmpname; System.Net.FtpWebRequest ftp = GetRequest(URI, username, password); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { //loop to read & write to file using (FileStream fs = new FileStream(localfile, FileMode.CreateNew)) { try { byte[] buffer = new byte[2048]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { //catch error and delete file only partially downloaded fs.Close(); //delete target file as it's incomplete File.Delete(localfile); throw; } } responseStream.Close(); } response.Close(); } try { File.Delete(localDir + @"\" + FtpFile); File.Move(localfile, localDir + @"\" + FtpFile); ftp = null; ftp = GetRequest(URI, username, password); ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; ftp.GetResponse(); } catch (Exception ex) { File.Delete(localfile); throw ex; } // 記錄日誌 "從" + URI.ToString() + "下載到" + localDir + @"\" + FtpFile + "成功." ); ftp = null; } /// <summary> /// 搜尋遠端檔案 /// </summary> /// <param name="targetDir"></param> /// <param name="hostname"></param> /// <param name="username"></param> /// <param name="password"></param> /// <param name="SearchPattern"></param> /// <returns></returns> public static List<string> ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern) { List<string> result = new List<string>(); try { string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern; System.Net.FtpWebRequest ftp = GetRequest(URI, username, password); ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory; ftp.UsePassive = true; ftp.UseBinary = true; string str = GetStringResponse(ftp); str = str.Replace("\r\n", "\r").TrimEnd('\r'); str = str.Replace("\n", "\r"); if (str != string.Empty) result.AddRange(str.Split('\r')); return result; } catch { } return null; } private static string GetStringResponse(FtpWebRequest ftp) { //Get the result, streaming to a string string result = ""; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { long size = response.ContentLength; using (Stream datastream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default)) { result = sr.ReadToEnd(); sr.Close(); } datastream.Close(); } response.Close(); } return result; }/// 在ftp伺服器上建立目錄
/// </summary>
/// <param name="dirName">建立的目錄名稱</param>
/// <param name="ftpHostIP">ftp地址</param>
/// <param name="username">使用者名稱</param>
/// <param name="password">密碼</param>
public void MakeDir(string dirName,string ftpHostIP,string username,string password)
{
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} /// <summary>
/// 刪除目錄
/// </summary>
/// <param name="dirName">建立的目錄名稱</param>
/// <param name="ftpHostIP">ftp地址</param>
/// <param name="username">使用者名稱</param>
/// <param name="password">密碼</param>
public void delDir(string dirName, string ftpHostIP, string username, string password)
{
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} /// <summary>
/// 檔案重新命名
/// </summary>
/// <param name="currentFilename">當前目錄名稱</param>
/// <param name="newFilename">重新命名目錄名稱</param>
/// <param name="ftpServerIP">ftp地址</param>
/// <param name="username">使用者名稱</param>
/// <param name="password">密碼</param>
public void Rename(string currentFilename, string newFilename, string ftpServerIP, string username, string password)
{
try
{
FileInfo fileInf = new FileInfo(currentFilename);
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.Rename;
ftp.RenameTo = newFilename;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex) { MessageBox.Show(ex.Message); } } private static FtpWebRequest GetRequest(string URI, string username, string password)
{
//根據伺服器資訊FtpWebRequest建立類的物件
FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
//提供身份驗證資訊
result.Credentials = new System.Net.NetworkCredential(username, password);
//設定請求完成之後是否保持到FTP伺服器的控制連線,預設值為true
result.KeepAlive = false;
return result;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net; /// <summary>
/// 向Ftp伺服器上傳檔案並建立和本地相同的目錄結構
/// 遍歷目錄和子目錄的檔案
/// </summary>
/// <param name="file"></param>
private void GetFileSystemInfos(FileSystemInfo file)
{
string getDirecName=file.Name;
if (!ftpIsExistsFile(getDirecName, "192.168.0.172", "Anonymous", "") && file.Name.Equals(FileName))
{
MakeDir(getDirecName, "192.168.0.172", "Anonymous", "");
}
if (!file.Exists) return;
DirectoryInfo dire = file as DirectoryInfo;
if (dire == null) return;
FileSystemInfo[] files = dire.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo fi = files[i] as FileInfo;
if (fi != null)
{
DirectoryInfo DirecObj=fi.Directory;
string DireObjName = DirecObj.Name;
if (FileName.Equals(DireObjName))
{
UploadFile(fi, DireObjName, "192.168.0.172", "Anonymous", "");
}
else
{
Match m = Regex.Match(files[i].FullName, FileName + "+.*" + DireObjName);
//UploadFile(fi, FileName+"/"+DireObjName, "192.168.0.172", "Anonymous", "");
UploadFile(fi, m.ToString(), "192.168.0.172", "Anonymous", "");
}
}
else
{
string[] ArrayStr = files[i].FullName.Split('\\');
string finame=files[i].Name;
Match m=Regex.Match(files[i].FullName,FileName+"+.*"+finame);
//MakeDir(ArrayStr[ArrayStr.Length - 2].ToString() + "/" + finame, "192.168.0.172", "Anonymous", "");
MakeDir(m.ToString(), "192.168.0.172", "Anonymous", "");
GetFileSystemInfos(files[i]);
}
}
}
/// <summary> /// 判斷ftp伺服器上該目錄是否存在 /// </summary> /// <param name="dirName"></param> /// <param name="ftpHostIP"></param> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> private bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password) { bool flag = true; try { string uri = "ftp://" + ftpHostIP + "/" + dirName; System.Net.FtpWebRequest ftp = GetRequest(uri, username, password); ftp.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } catch (Exception ) { flag = false; } return flag; }
相關推薦
C# 上傳本地檔案至ftp上的方法
.NET程式設計實現FTP上傳檔案 1.WebClient非同步上傳 關鍵知識說明: WebClient類提供4個非同步上傳方法,使用方法都是差不多的. WebClient.UploadDataAsync方法 將資料緩衝區上載到指定的資源 WebClient.UploadF
上傳本地檔案到hdfs上
package com.yc.hadoop.hdfs; import java.net.URI; import java.util.Scanner; import org.apache.hadoop.conf.Configuration; import org.apache.
C# 利用Rar壓縮檔案並FTP上傳
1.利用Rar壓縮檔案 /// <summary> /// 使用Rar壓縮檔案 /// </summary> /// <param name="fromFilePath">待
上傳文件至ftp
ont {0} use code eth ftp request cnblogs .get public class UploadFile { string ftpServerIP; string ftpRemotePath;
git命令上傳本地檔案到GitHub
git命令上傳本地檔案到GitHub 1.下載git工具 2.繫結使用者 啟動gitBash 繫結使用者名稱和郵箱 在開啟的GIt Bash中輸入以下命令(使用者和郵箱為你github註冊的賬號和郵箱) $ git c
windows上傳本地專案至linux伺服器中的gitlab
1、安裝git: https://git-scm.com/downloads linux伺服器中安裝gitlab: https://blog.csdn.net/
【小白】上傳本地檔案到GitHub
GitHub作為開原始碼庫,本文講解一下小白如何將原生代碼託管到GitHub上。 目錄 (一)安裝Git客戶端 (二)在Github建立倉庫 (三)託管原生代碼到Github (一)安裝Git客
遠端桌面撥號VPS如何上傳本地檔案
VPS可以執行程式,掛遊戲等,就算本機電腦關了,也不會斷開,我們經常需要將本地電腦上的檔案傳到vps上來使用 VPS如何上傳本地檔案教程 1.開始-執行,輸入mstsc,點確定 2.輸入購買的賬號,點選選項 3.選擇本地資源,然後點選詳細資訊 4.點一下驅動器左邊的+,然後在裡面選擇你要上傳的檔案是
大資料學習——上傳本地檔案到叢集根目錄下
TestHDFS.java package cn.itcast.hdfs; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem
maven deploy上傳本地jar至私服
現在做java這一塊的研發基本上都是使用maven作為專案jar包的管理工具,而且用到的jar一般都是公網伺服器所存在的例如我一般到https://mvnrepository.com/ 中獲取所需jar的依賴配置資訊; 但是也有時會遇到公網中不存在的例如自己封裝的相關jar、
阿里雲oss上傳本地檔案到伺服器例項
Java 專案開發中阿里雲 oss上傳本地到伺服器以及下載功能實現例項。 AliyunOSSUtil類: public class AliyunOSSUtil { /** * 該示例程式碼展示瞭如果在OSS中建立和刪除一個Bucket,以及如何上傳和下載一個檔案。 *
上傳本地檔案到Github遠端倉庫
環境:windows7 64位 前提要求:已經有了github賬號,已經安裝了Git(一路預設,很簡單) 一:建立Github repository(倉庫) 勾選 Initialize this repository with a READM
上傳大檔案至阿里雲伺服器解決方案(理論上無限大檔案,支援批量處理)
一、背景 目前本地電腦有一個約120G壓縮檔案資料需要上傳到阿里雲伺服器。 二、方案 1.首先嚐試直接從本地複製檔案到雲伺服器,在檔案比較小的情況下OK。這個大檔案中途若遇到網路不穩定將會異常斷線,pass。 2.其次是將該壓縮拆分至每個少於20G,上傳至百度雲盤,
上傳本地檔案到github
通過git工具上傳本地資料夾(本地專案) 1.下載git工具 2.繫結使用者 開啟git-bash.exe 在開啟的GIt Bash中輸入以下命令(使用者和郵箱為你github註冊的賬號和郵箱) $ git config --global
android之上傳本地專案至github上並且管理專案
很多小夥伴在開發中大部分使用的都是SVN來管理本地專案 今天講述一下本地專案上傳到github上,並且可以本地編寫程式碼、上傳程式碼、恢復以前版本等操作 1、首先本地要有一個android的專案,然後
如何將上傳本地檔案到github
看過了幾個教程,總結出最適合自己的比較簡單的方法。這裡有兩種方法上傳本地檔案到github1. github在線上傳資料夾在線上傳也可以上傳完整的資料夾結構,直接拖拽到上傳檔案頁面的框中即可。1.1點選上傳檔案點選上傳1.2 直接拖拽直接拖拽即可上傳資料夾及資料夾裡面的檔案。
通過下載lrzsz的tar包,實現rz命令上傳本地檔案
通常情況下沒有rz命令,是要從yum源下載rpm安裝的。可是我的linux沒有yum源,想安裝可總是不成功,只能放棄,所以就想下載lrzsz的tar包來安裝,畢竟這也是一種辦法 1,點選開啟連結htt
ssh上傳本地檔案到linux伺服器
1、從伺服器上下載檔案scp [email protected]39.107.80.119:/var/www/test.js 把192.168.0.101上的/var/www/test.js
第一次使用Git上傳本地專案到github上,下載、安裝、上傳(很詳細,很全面)
我覺得學習github的人基本上已經快要脫離了小白的標籤,雖然我一直喜歡自稱為小白。對於程式設計師原來說應該都聽說過GitHub,GitHub有許多開源的的專案和一些前沿的技術。因為自己在第一次使用過Git和github時遇到過不少的坑,所以,想對第一次使用Gi
ASP.NET MVC檔案上傳、檔案拖拽上傳demo
Introduction In this article I am explaiing three ways to upload image from an ASP.NET MVC web application to server and accessing those back to display