예제 #1
0
        /// <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;
            }
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
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;
         }
     }
 }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
 /// <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);
 }
예제 #6
0
 /// <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);
 }
예제 #7
0
 /// <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);
 }