asp.net mvc3.0上传图片以二进制的形式保存到数据库中并显示出来,而且还能通过js预览(跨浏览器)

一、前台脚本实现图片上传之前的预览效果

@using (Html.BeginForm("SaveImg", "Test", FormMethod.Post, new { enctype = "multipart/form-data", id = "filefrm" }))
@*一定要记得加enctype = "multipart/form-data"属性否则不能在后台获取到*@
{
    <input type="file" id="uploadfile" name="uploadfile" /><input id="submit" type="submit"
        value="上传" />
}
<div id="divPreview">
    <img id="preview" src="" />这里是预览图片
</div>
<img src="/Test/LookImg" />这里是实现上传之后的图片
@if (false)
    <script src="http://www.cnblogs.com/Scripts/jquery-1.5.1-vsdoc.js" type="text/javascript"></script>
}
<script type="text/javascript">
    $(document).ready(function () {
        $("#submit").click(function (e) {
            var $file = $("#uploadfile");
            var filename = $file.val(), index, ext;
            if (filename.length === 0) { alert("请选择要上传的文件"); e.preventDefault(); return false; }
            index = filename.lastIndexOf('.');
            ext = filename.substring(index + 1, filename.length);
            if (ext !== "gif" && ext !== "jpeg" && ext != "png" && ext != "jpg") {
                alert("上传的文件格式不正确!");
                e.preventDefault();
                return false;
            }
        });
        $("#uploadfile").change(function () {
            ShowImg(this);
        });
    });
    function ShowImg(obj) {    //上传之前先进行图片的预览
 
        var browserVersion = window.navigator.userAgent.toUpperCase(); //浏览器版本信息 
        if (obj) {
            //ie  
            if (window.navigator.appName == "Microsoft Internet Explorer") {//ie浏览器
                if (browserVersion.indexOf("MSIE 6.0") > -1) {//ie6
                    $("#preview").attr("src", obj.value);
                } else {//ie7、ie8、ie9未测试
                    //if(browserVersion.indexOf("MSIE 7.0")>-1 || browserVersion.indexOf("MSIE 8.0")>-1 ||browserVersion.indexOf("MSIE 9.0")>-1)
                    //滤镜实现
                    obj.select();
                    var newPreview = document.getElementByIdx_x("divNewPreview");
                    if (newPreview == null) {
                        newPreview = document.createElement_x("div");
                        newPreview.setAttribute("id", "divNewPreview");
                        newPreview.style.width = "170";
                        newPreview.style.height = "160";
                        newPreview.style.border = "solid 1px #d2e2e2";
                    }
                    newPreview.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='" + document.selection.createRange().text + "')";
                    $("#divPreview").attr("style", "display:none");
                    $("#divPreview").after(newPreview);
                }
            }
            //firefox  
            else if (window.navigator.userAgent.indexOf("Firefox") >= 1) {
                var firefoxVersion = parseFloat(window.navigator.userAgent.toLowerCase().match(/firefox\/([\d.]+)/)[1]);
                if (obj.files) {
                    //return window.URL.createObjectURL(obj.files[0]);
                    if (firefoxVersion < 7) {//firefox7.0以下版本
                        $("#preview").attr("src", obj.files[0].getAsDataURL());
                    } else {//火狐7.0以上版本
                        $("#preview").attr("src", window.URL.createObjectURL(obj.files[0]));
                    }
                }
            }
            else if (obj.files) {
                //兼容chrome等,也可以兼容火狐,通过HTML5来获取路径                   
                if (typeof FileReader !== "undefined") {
                    var reader = new FileReader();
                    reader.onload = function (e) { $("#imgHeadPhoto").attr("src", e.target.result); }
                    reader.readAsDataURL(obj.files[0]);
                } else if ($.browser.safari) {
                    alert("暂时不支持Safari浏览器!");
                }
            } else {
                $("#preview").attr("src", obj.value); //其他
            }
 
        }
    } 
</script>
二、后台接收上传的文件进行二进制的形式保存
  [HttpPost]
        public void SaveImg()
        {
 
            HttpPostedFileBase postedfile = Request.Files["uploadfile"];
            if (postedfile.ContentLength > 0)
            {
                int len = postedfile.ContentLength;
                string contentType = postedfile.ContentType;
                byte[] bytes = new byte[len];
                Stream obj = postedfile.InputStream;
                obj.Read(bytes, 0, len);
                obj.Close();
                Test test = new Test();
                if (test.AddPicture(bytes, contentType, len) > 0)
                {
                    Response.Write("Y");
                }
                else
                {
                    Response.Write("N");
                }
            }
            else
            {
                Response.Write("N");
            }
        }
 public int AddPicture(byte[] bytes, string contentType, int size)
        {
            string sqlStr = string.Format("INSERT INTO PicTable(Picture,ContentType,ImageSize) VALUES(@pic,@type,@size)");
            using (SqlConnection con = new SqlConnection())
            {
                con.ConnectionString = "server=.;database=test;Trusted_Connection=true;";
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = sqlStr;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@pic", SqlDbType.VarBinary, size).Value = bytes;
                cmd.Parameters.Add("@type", SqlDbType.VarChar, 30).Value = contentType;
                cmd.Parameters.Add("@size", SqlDbType.Int, 4).Value = size;
                con.Open();
                return cmd.ExecuteNonQuery();
            }
 
        }
三、实现图片的代码
  public void LookImg()
        {
            string sqlStr = string.Format("SELECT Picture,ContentType,ImageSize FROM dbo.PicTable WHERE ImageID={0}",1);
            SqlDataReader reader = SqlHelper.GetSqlDataReader("server=.;database=test;Trusted_Connection=true;", sqlStr, false, null);
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    byte[] bytes = (byte[])reader[0];
                    int len = (int)reader[2];
                    string contenType = (string)reader[1];
                    MemoryStream ms = new MemoryStream(bytes,0,len);
                    Response.ContentType = contenType;
                    ms.WriteTo(Response.OutputStream);
                }
            }
        }
posted on 2012-08-03 17:13  douqiumiao  阅读(661)  评论(0编辑  收藏  举报