圖片上傳根據stream生成image


對於圖片上傳代碼的整合

因為需要判斷上傳的圖片的寬高是否符合尺寸,所以在最初拿到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; }
    }
圖片上傳代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM