webapi批量上傳照片到ftp服務器(base64)

一段demo。作的時候根據本身的需求改造下數組

public HttpResponseMessage AddVisitNew(HttpRequestMessage request, CustomerVisitAddNewModel model)
        {
            return CreateHttpPostResponse<long>(request, () =>
            {
                var res = customerVisitInfoService.AddVisitNew(model, CurrentUserId);
                if (string.IsNullOrEmpty(res.Error))
                {
                    // 上傳拜訪記錄照片
                    string visitPath = null;
                    FtpClient ftpClient = new FtpClient(GlobalConst.FtpAddress, GlobalConst.Username, GlobalConst.Password);
                    string visitUploadDir = Path.Combine(GlobalConst.FILE_VISIT, "file");

                    for (var i = 0; i < model.VisitPic.Count; i++)
                    {
                        //獲取base64編碼的圖片
                        HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];

                        //獲取文件儲存路徑
                        string path = context.Request.MapPath("~/"); //獲取當前項目所在目錄
                        string fName = "{0}".Fmt(DateTime.Now.ToString("yyyyMMddHHmmssfff")) + i;
                        string suffix = ".jpg"; 
                        string strPath = path + "App_Data/" + fName + suffix;
                        string newFileName = fName + suffix;

                        //獲取圖片並保存
                        Base64ToImg(model.VisitPic[i].Split(',')[1]).Save(strPath);
                        
                        //上傳FTP
                        string uploadFilePath = Path.Combine(visitUploadDir, newFileName);
                        visitPath = ftpClient.UploadFile(strPath, uploadFilePath, true);
                        //FTP 轉 HTTP
                        visitPath = "{0}".Fmt(UriHelper.GetAbsolutePath(visitPath));
                        
                        var pic = new VisitPiction
                        {
                            CustomerVisitInfoId = res.Data,
                            Createtime = DateTime.Now,
                            Path = visitPath
                        };
                        customerVisitInfoService.AddVisitPic(pic);
                    }
                    Logger.Info("visits/add customer: " + model.CustomerId + ", VisitStatus: " + model.VisitStatus + ", ReVisitPlanTime: " + model.ReVisitPlanTime + ", ExpenrienceTime: " + model.ExpenrienceTime);
                }
                return res;
            });
        }

        //解析base64編碼獲取圖片
        private Bitmap Base64ToImg(string base64Code)
        {
            MemoryStream stream = new MemoryStream(Convert.FromBase64String(base64Code));
            return new Bitmap(stream);
        }
public static class StringExtensions
    {
        /// <summary>
        /// 將指定字符串中的格式項替換爲指定數組中相應對象的字符串表示形式。
        /// </summary>
        /// <param name="format">須要格式化的字符串。</param>
        /// <param name="args">一個對象數組,其中包含零個或多個要設置格式的對象。</param>
        /// <returns></returns>
        public static string Fmt(this String format, params object[] args)
        {
            return string.Format(format, args);
        }
    }
public class FtpClient
    {
        /// <summary>
        /// FTP 服務器的 IP 地址,例如:ftp://139.129.21.10/。
        /// </summary>
        public string FtpAddress { get; set; }

        /// <summary>
        /// FTP 服務器通信的用戶名。
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// FTP 服務器通信的密碼。
        /// </summary>
        public string Password { get; set; }

        public FtpClient(string ftpAddress, string userName, string password)
        {
            this.FtpAddress = ftpAddress;
            this.UserName = userName;
            this.Password = password;
        }

        /// <summary>
        /// 建立 System.Net.FtpWebRequest 的實例。
        /// </summary>
        /// <param name="path"></param>
        /// <param name="method"></param>
        /// <param name="keepAlive"></param>
        /// <returns></returns>
        private FtpWebRequest CreateRequest(string path, string method = WebRequestMethods.Ftp.DownloadFile,
            bool keepAlive = false)
        {
            if (!Path.HasExtension(path))
                path = !(path.EndsWith("/") || path.EndsWith("\\")) ? "{0}/".Fmt(path) : path;
            string uriString = Path.Combine(FtpAddress, path.Replace("\\", "/"));
            Uri requestUri = new Uri(uriString);
            FtpWebRequest result = (FtpWebRequest)WebRequest.Create(requestUri);
            result.Method = method;
            result.KeepAlive = keepAlive;
            //result.UsePassive = usePassive;
            result.Credentials = new NetworkCredential(UserName, Password);
            return result;
        }

        /// <summary>
        /// 返回指定路徑字符串的目錄信息。對 System.IO.Path.GetDirectoryName() 方法的封裝。
        /// </summary>
        /// <param name="path">文件或目錄的路徑。</param>
        /// <returns></returns>
        public static string GetDirectoryName(string path)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(path))
            {
                if (!string.IsNullOrEmpty(Path.GetExtension(path)))
                    result = Path.GetDirectoryName(path);
                else
                    result = !(path.EndsWith("/") || path.EndsWith("\\")) ? "{0}/".Fmt(path) : path;
            }
            return result;
        }

        /// <summary>
        /// 檢查遠程是否存在指定文件夾目錄。
        /// </summary>
        /// <param name="directory">文件夾目錄路徑。</param>
        /// <returns></returns>
        public bool IsDirectoryExist(string directory)
        {
            var result = true;
            try
            {
                directory = FtpClient.GetDirectoryName(directory);
                 var ftpWebRequest = this.CreateRequest(directory, WebRequestMethods.Ftp.ListDirectory);
                using (var ftpWebResponse = ftpWebRequest.GetResponse()) { }
            }
            catch
            {
                result = false;
            }
            return result;
        }

        /// <summary>
        /// 建立指定文件夾目錄。
        /// </summary>
        /// <param name="directory">文件夾目錄路徑。</param>
        /// <param name="isThrowEx">是否拋出異常。</param>
        /// <returns></returns>
        public bool CreateDirectory(string directory, bool isThrowEx = false)
        {
            var result = false;
            try
            {
                //一級一級建立文件夾目錄
                directory = FtpClient.GetDirectoryName(directory);
                string[] directorys = directory.Split('/', '\\');
                string path = string.Empty; //上級目錄
                foreach (var dir in directorys)
                {
                    path = "{0}{1}/".Fmt(path, dir);
                    if (!IsDirectoryExist(dir))
                    {
                        var ftpWebRequest = this.CreateRequest(path, WebRequestMethods.Ftp.MakeDirectory);
                        using (var ftpWebResponse = ftpWebRequest.GetResponse()) { }
                    }
                    result = true;
                }
            }
            catch (Exception ex)
            {
                if (isThrowEx) throw ex;
                result = false;
            }
            return result;
        }

        /// <summary>
        /// 上傳文件。
        /// </summary>
        /// <param name="loclFilePath">須要上傳的本地文件路徑。</param>
        /// <param name="remoteFilePath">上傳的遠程文件路徑。</param>
        /// <param name="isThrowEx">是否拋出異常。</param>
        /// <returns></returns>
        public string UploadFile(string loclFilePath, string remoteFilePath, bool isThrowEx = false)
        {
            string result = string.Empty;
            try
            {
                if (!IsDirectoryExist(remoteFilePath))
                    CreateDirectory(remoteFilePath, true);
                FileInfo fileInfo = new FileInfo(loclFilePath);
                var ftpWebRequest = this.CreateRequest(remoteFilePath, WebRequestMethods.Ftp.UploadFile);
                ftpWebRequest.ContentLength = fileInfo.Length;
                //將文件流寫入請求流中
                using (var fileStream = fileInfo.OpenRead())
                {
                    using (var requestStream = ftpWebRequest.GetRequestStream())
                    {
                        int bufferLength = 2048;
                        byte[] buffer = new byte[bufferLength];
                        int readLength = 0;
                        while ((readLength = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            requestStream.Write(buffer, 0, readLength);
                        }
                    }
                }
                result = ftpWebRequest.RequestUri.AbsoluteUri;
            }
            catch (Exception ex)
            {
                if (isThrowEx) throw ex;
            }
            return result;
        }
    }
相關文章
相關標籤/搜索