對於圖片上傳代碼的整合
因為需要判斷上傳的圖片的寬高是否符合尺寸,所以在最初拿到inputstream的時候,就直接獲取image格式的圖片
本來是想在下面的checkFile中獲取的,不過直接使用System.Drawing.Image.FromStream(request.PostedFile.InputStream);的時候報錯了,錯誤意思是說參數為空,應該是由於上面獲取byte[]file的時候,關閉了stream,導致request.PostFile.InputStream也沒有了,所以直接在IO中讀取數據流的時候獲取image格式對象
突然想起來還有個 image和bitmap之間的轉換:
因為png格式的保存用的是bitmap空白處才不會填充,所以會使用到這種轉換
Image originalImage = Image.FromFile(originalImagePath); Bitmap oriImg = new Bitmap(originalImage);

public class UploadService { public bool SaveAs(UploadRequest request, out string filePath, out string errMessage) { filePath = string.Empty; //**************************************初始化byte長度. byte[] file = new Byte[request.PostedFile.ContentLength]; //**************************************讀取stream,並轉換為byte類型以及獲取image類型 System.IO.Stream stream = request.PostedFile.InputStream; stream.Read(file, 0, request.PostedFile.ContentLength); Image image = System.Drawing.Image.FromStream(stream); stream.Close(); //**************************************判斷條件 if(!CheckFile(request,image, file, out errMessage)){ return false; } //**************************************設置路徑 SetFile(ref request); filePath = request.SavePath; //**************************************保存至文件路徑 var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write); fs.Write(file, 0, file.Length); fs.Flush(); fs.Close(); //**************************************獲取相對路徑 filePath = GetSimplePath(filePath); if (string.IsNullOrEmpty(errMessage)) { return true; } else { return false; } } /// <summary> /// 判斷文件的相關條件 /// </summary> /// <param name="request"></param> /// <param name="file"></param> /// <param name="errMessage"></param> /// <returns></returns> private bool CheckFile(UploadRequest request,Image image, byte[] file, out string errMessage) { errMessage = string.Empty; // 讀取原始文件名 string localFileName = Path.GetFileName(request.PostedFile.FileName); //得到擴展名 var ext = localFileName.Substring(localFileName.LastIndexOf('.') + 1).ToLower(); //如果沒有設定擴展名,則使用本身的擴展名存儲 if (string.IsNullOrEmpty(request.Ext)) { request.Ext = ext; } //判斷傳入的數據 if (file.Length == 0) { errMessage = "無數據提交"; return false; } //判斷文件是否超過限定大小 if (file.Length > this.MaxFilesize) { errMessage = "文件大小超過" + this.MaxFilesize + "字節"; return false; } //判斷擴展名是否屬於給定的 if (request.Format!=null&& request.Format.Length > 0 && !request.Format.Contains(ext)) { errMessage = "上傳文件擴展名必需為:" + string.Join(",", request.Format); return false; } //判斷寬高是否符合要求 if (request.Width > 0||request.Height>0) { if (request.Width>0&&Math.Abs( image.Width-request.Width)>1) { errMessage="寬不符合"; image.Dispose(); return false; } else if(request.Height>0&&Math.Abs(image.Height-request.Height)>1){ errMessage="高不符合"; image.Dispose(); return false; } } return true; } /// <summary> /// 設置保存路徑以及創建文件夾 /// </summary> /// <param name="request"></param> private void SetFile(ref UploadRequest request) { //如果路徑沒有設定,則按照給定的路徑設置,不過給定路徑的話,一定得先確保這個路徑是正確的,且存在的 if (string.IsNullOrEmpty(request.SavePath)) { string subfolder = "day_" + DateTime.Now.ToString("yyMMdd"); string fileFolder = Path.Combine(UploadConfigContext.UploadPath, request.Folder, subfolder); //文件全路徑 request.SavePath = Path.Combine(fileFolder, string.Format("{0}{1}.{2}", DateTime.Now.ToString("yyyyMMddhhmmss"), new Random(DateTime.Now.Millisecond).Next(10000), request.Ext) ); if (!Directory.Exists(fileFolder)) { Directory.CreateDirectory(fileFolder); } } } } /// <summary> /// 上傳使用的參數 /// </summary> public class UploadRequest { /// <summary> /// 自行設置時,保存的子文件夾 /// </summary> public string Folder { get; set; } /// <summary> /// 設置路徑的,如果沒設置,則代碼自行設置 /// </summary> public string SavePath { get; set; } /// <summary> /// 上傳的數據 /// </summary> public HttpPostedFileBase PostedFile { get; set; } /// <summary> /// 用來自定義控制擴展名的 /// </summary> public string[] Format { get; set; } /// <summary> /// 控制寬,<=0則表示不管 /// </summary> public int Width { get; set; } /// <summary> /// 控制高,<=0則表示不管 /// </summary> public int Height { get; set; } /// <summary> /// 擴展名 /// </summary> public string Ext { get; set; } }