Asp.Net HttpPostedFile和base64兩種上傳圖片(文件)方式


      之前上傳圖片基本都是用的HttpPostedFile方式獲取圖片,這次因為需求關系,要對准備上傳的圖片進行刪除,最后提交的時候才去保存圖片到服務器,

找了下資料,html5有個新的東西出來,js 里面的FileReader用法也寫下,有了這個可以很快速的開發一個適配的圖片上傳插件出來

$('#img_upload').change(function () {// img_upload 為 input 標簽的id
        var maxsize = 2 * 1024 * 1024;//2M
        var file = this.files[0];
        var size = this.files[0].size;
        var suffix = file.name.split('.')[1];
// 前端初步判斷下后綴名是否為圖片,更為精確的方式要在服務器端進行 if (suffix.toLowerCase() != "jpg" && suffix.toLowerCase() != "jpeg" && suffix.toLowerCase() != "gif" && suffix.toLowerCase() != "png") { alert("請上傳JPG、JPEG、GIF與PNG格式的圖片"); return; } if (size >= maxsize) { alert("上傳的文件必須小於2M!!!"); return; } var r = new FileReader(); r.readAsDataURL(file); $(r).load(function () { document.getElementById("avatarimg").src = this.result;// this.result 就是 data:image/jpeg;base64,開頭的base64格式圖片 }); });

  服務器端處理如下

    /// <summary>
    /// 將 html5 FileReader 讀出來的base64格式圖片轉化成一定格式的圖片存起來
    /// </summary>
    /// <param name="base64Str">開頭為data:image/jpeg;base64, + base64圖片字符串</param>
    /// <param name="domain">引用程序域名</param>
    /// <param name="savePath">根目錄開始的保存路徑: uploadfile\\201703 不存在該路徑則會自動創建 </param>
    /// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
    /// <param name="extension">.jpg</param>
    /// <param name="limitSize">限制字節長度</param>
    /// <returns>1:面向用戶的錯誤信息  </returns>
    public static SaveImageResult SaveBase64StrToImage(string base64Str, string domain, string savePath, string saveName, string extension, long limitSize)
    {
        SaveImageResult result = new SaveImageResult();
        string imgFullName = saveName + extension;  // 格式類似 20170903787878.jpg
        try
        {
            result.ReturnPath = domain + "/" + savePath.Replace("\\", "/") + "/" + imgFullName;// 格式類似 http:axx.xxx.com/uploadfile/2017/03/201709044645545454.jpg
        }
        catch (Exception)
        {
            throw new Exception("參數savePath格式錯誤");
        }
        byte[] arr = null;
        try
        {
            arr = Convert.FromBase64String(base64Str.Substring(base64Str.IndexOf("base64,") + 7));//切除前面那段image標識
        }
        catch (Exception)
        {
            throw new Exception("參數base64Str格式錯誤");
        }

        long size = arr.LongLength;

        if (size <= limitSize)// 判斷文件大小是否超出限制
        {
            string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 獲取物理路徑

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            using (MemoryStream ms = new MemoryStream(arr))
            {
                try
                {
                    Bitmap bmp = new Bitmap(ms);// 此處如果傳入的不是一張圖片,這里會拋異常
                    bmp.Save(path + "\\" + imgFullName);
}
catch (Exception)
{
throw new Exception("圖片保存失敗,請檢查傳入參數");
}
}
}
else
{
result.ErrorCode
= 1;
result.ErrorMessage
= "圖片超過限制大小";
}
if (result.ErrorCode != 0)// 如果有出錯,返回路徑變成空
{
result.ReturnPath
= "";
}
return result;
}

    /// <summary>
    /// base64格式轉圖片存儲結果
    /// 
    /// </summary>
    public class SaveImageResult
    {
        /// <summary>
        /// 0:無錯誤 1:面向用戶的錯誤信息
        /// </summary>
        public int ErrorCode { get; set; }

        /// <summary>
        /// 錯誤信息
        /// </summary>
        public string ErrorMessage { get; set; }

        /// <summary>
        /// 返回用於存儲的路徑
        /// </summary>
        public string ReturnPath { get; set; }

    }
 
         

 

 

 

 

 base64方式講完,下面再附上一個普通的HttpPostedFile方式上傳的方法

/// <summary>
    ///  保存上傳的圖片,自帶用Image對象的方式判斷是否為圖片,自動獲取后綴名
    /// </summary>
    /// <param name="file">文件 ,該參數可由System.Web.Request.Files集合的索引來得到</param>
    /// <param name="savePath">根目錄開始的保存路徑: uploadfile\\201703 不存在該路徑則會自動創建 </param>
    /// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
    /// <param name="limitSize">限制字節長度</param>
    /// <returns></returns>
    public static SaveImageResult SaveImage(System.Web.HttpPostedFile file, string domain, string savePath, string saveName, long limitSize)
    {
        SaveImageResult result = new SaveImageResult();
        if (file == null)
        {
            result.ErrorCode = 1;
            result.ErrorMessage = "請上傳圖片";
        }
        string extension = System.IO.Path.GetExtension(file.FileName);// 獲取后綴名
        string imgFullName = saveName + extension;  // 格式類似 20170903787878.jpg
        try
        {
            result.ReturnPath = domain + "/" + savePath.Replace("\\", "/") + "/" + imgFullName;// 格式類似 http:app.darchin.com/uploadfile/2017/03/201709044645545454.jpg
        }
        catch (Exception)
        {
            throw new Exception("參數savePath格式錯誤");
        }
        if (file.ContentLength <= limitSize)// 判斷文件大小是否超出限制
        {
            System.Drawing.Image img = null;
            try
            {
                img = System.Drawing.Image.FromStream(file.InputStream);
            }
            catch (Exception)
            {
                result.ErrorCode = 1;
                result.ErrorMessage = "請上傳正確格式的圖片";
            }

            string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 獲取物理路徑

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            try
            {
                img.Save(path + "\\" + imgFullName);
            }
            catch (Exception)
            {
                throw new Exception("圖片保存失敗,請檢查傳入參數");
            }

        }
        else
        {
            result.ErrorCode = 1;
            result.ErrorMessage = "上傳的圖片超過限制大小";
        }
        if (result.ErrorCode != 0)// 如果有出錯,返回路徑變成空
        {
            result.ReturnPath = "";
        }
        return result;
    }

如果上面所講有錯或者不足的地方還請各位朋友指出,感激不盡


免責聲明!

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



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