/// <summary> /// 上传内存流 /// </summary> /// <param name="path"></param> /// <param name="stream"></param> /// <param name="length"></param> /// <param name="rateCallback"></param> public static void UploadStreamAbsolute(string path, Stream stream, long length = 0, RateDelegate rateCallback = null) { var request = (FtpWebRequest)WebRequest.Create(path); request.Method = WebRequestMethods.Ftp.UploadFile; request.UseBinary = true; request.UsePassive = true; request.ContentLength = stream.Length; var content = new byte[BufferSize - 1 + 1]; stream.Position = 0; try { using (var requestStream = request.GetRequestStream()) { long position = 0; int dataRead; do { dataRead = stream.Read(content, 0, BufferSize); position += dataRead; rateCallback?.Invoke(position, length); requestStream.Write(content, 0, dataRead); } while (!(dataRead < BufferSize)); } } catch (Exception) { DeleteAbsoluteFile(path); throw; } }
public static void DownLoadAbsoluteFile(Stream stream, string path, RateDelegate rateCallBack = null) { long fileLength = 0; if (rateCallBack != null) { var request = (FtpWebRequest)WebRequest.Create(path); request.Method = WebRequestMethods.Ftp.GetFileSize; request.UseBinary = true; using (var ftpWebResponse = (FtpWebResponse)request.GetResponse()) { fileLength = ftpWebResponse.ContentLength; } } var ftpWebRequest = (FtpWebRequest)WebRequest.Create(path); ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile; ftpWebRequest.UseBinary = true; ftpWebRequest.UsePassive = false; using (var response = (FtpWebResponse)ftpWebRequest.GetResponse()) { using (var responseStream = response.GetResponseStream()) { var buffer = new byte[BufferSize]; int read; long position = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); position += read; rateCallBack?.Invoke(position, fileLength); stream.Write(buffer, 0, read); } while (read != 0); } } }
public static void DownLoadAbsoluteFile(string local, string target, RateDelegate rateCallback = null) { using (var fileStream = new FileStream(local, FileMode.Create)) { try { DownLoadAbsoluteFile(fileStream, target, rateCallback); } catch (Exception) { File.Delete(local); throw; } } }
/// <summary> /// 上传本地文件 /// </summary> /// <param name="path"></param> /// <param name="localFile"></param> /// <param name="rateCallback"></param> public static void UploadFileAbsolute(string path, string localFile, RateDelegate rateCallback = null) { if (!File.Exists(localFile)) { throw new ArgumentException("上传的源文件已不存在或地址错误"); } var fileInfo = new FileInfo(localFile); using (var fileStream = fileInfo.OpenRead()) { UploadStreamAbsolute(path, fileStream, fileInfo.Length, rateCallback); } }
/// <summary> /// 若UsePassive设置为 true,FTP服务器可能不会发送文件的大小,且下载进度可能始终为零。 /// 若UsePassive设置为 false,防火墙可能会引发警报并阻止文件下载。 /// </summary> /// <param name="localPath">文件路径</param> /// <param name="relativeFilePath">ftp文件相对地址</param> /// <param name="rateCallback"></param> public void DownloadRelativeFile(string localPath, string relativeFilePath, RateDelegate rateCallback = null) { DownLoadAbsoluteFile(localPath, BaseUrl + relativeFilePath, rateCallback); }
/// <summary> /// 上传内存流 /// </summary> /// <param name="relativeFilePath"></param> /// <param name="stream"></param> /// <param name="len"></param> /// <param name="rateCallback"></param> public void UploadStreamRelative(string relativeFilePath, Stream stream, long len = 0, RateDelegate rateCallback = null) { UploadStreamAbsolute(BaseUrl + relativeFilePath, stream, len, rateCallback); }
/// <summary> /// 上传/更新文件,如果不存在则创建,如果存在目标文件名则更新 /// </summary> /// <param name="relativeFilePath">带文件名的目标路径</param> /// <param name="localFile">本地路径</param> /// <param name="rateCallback"></param> public void UploadFileRelative(string relativeFilePath, string localFile, RateDelegate rateCallback = null) { UploadFileAbsolute(BaseUrl + relativeFilePath, localFile, rateCallback); }