ASP.NET项目无法显示存储在MS Access数据库中的图片如何解决
核心问题
你在插入数据时直接将字节数组变量拼接入SQL字符串,C#会自动调用字节数组的ToString()方法,最终存入img_data字段的是"System.Byte[]"字符串,而非真实的图片二进制数据,因此读取后转Base64也无法生成有效图片链接。
注意:字符串拼接SQL的方式除了会导致二进制数据存储失败,还存在严重的SQL注入风险,必须替换为参数化查询。
修复存储逻辑
将插入逻辑替换为参数化写法,正确传递二进制参数:
protected void btn_create_Click(object sender, EventArgs e) { HttpPostedFile postedfile = FileUpload1.PostedFile; String filename = Path.GetFileName(postedfile.FileName); String fileextension = Path.GetExtension(filename); int filesize = postedfile.ContentLength; if(fileextension.ToLower()==".jpg" || fileextension.ToLower() == ".png") { Stream stream = postedfile.InputStream; BinaryReader binaryReader = new BinaryReader(stream); byte[] bytes = binaryReader.ReadBytes((int)stream.Length); con.Open(); // 用参数占位符替换直接拼接 OleDbCommand cmd = new OleDbCommand(@"insert into studentdetails(s_name,age,phone_no,city,state,email,qualification,field,years_exp,description,image_name,img_size,img_data) values(@s_name,@age,@phone_no,@city,@state,@email,@qualification,@field,@years_exp,@description,@image_name,@img_size,@img_data)", con); // OleDb不识别参数名只识别顺序,必须按SQL占位符顺序添加参数 cmd.Parameters.AddWithValue("@s_name", txt_name.Text); cmd.Parameters.AddWithValue("@age", Convert.ToInt32(txt_age.Text)); cmd.Parameters.AddWithValue("@phone_no", txt_phone.Text); cmd.Parameters.AddWithValue("@city", txt_city_stud.Text); cmd.Parameters.AddWithValue("@state", txt_state_stud.Text); cmd.Parameters.AddWithValue("@email", txt_mail.Text); cmd.Parameters.AddWithValue("@qualification", ddl_qualifiy.SelectedValue); cmd.Parameters.AddWithValue("@field", txt_field.Text); cmd.Parameters.AddWithValue("@years_exp", Convert.ToInt32(txt_years.Text)); cmd.Parameters.AddWithValue("@description", txt_extra.Text); cmd.Parameters.AddWithValue("@image_name", filename); cmd.Parameters.AddWithValue("@img_size", filesize); // 直接传递字节数组参数,自动识别为OLE二进制类型 cmd.Parameters.AddWithValue("@img_data", bytes); cmd.ExecuteNonQuery(); Response.Write("<script>alert('Profile created');</script>"); con.Close(); Response.Redirect("~/profilepage.aspx?email=" + txt_mail.Text); } }
读取逻辑优化(可选)
当前读取逻辑本身没有错误,建议增加空值判断和MIME类型适配,避免部分场景显示异常:
create_email = Request.QueryString["email"]; OleDbCommand cmd = new OleDbCommand("select img_data, image_name from studentdetails where email=@email", con); // 读取逻辑也用参数化,避免SQL注入 cmd.Parameters.AddWithValue("@email", create_email); con.Open(); OleDbDataReader reader = cmd.ExecuteReader(); if(reader.Read()) { if(!reader.IsDBNull(reader.GetOrdinal("img_data"))) { byte[] bytes = (byte[])reader["img_data"]; string strbase64 = Convert.ToBase64String(bytes); // 根据文件名后缀适配MIME类型,兼容PNG格式显示 string imgName = reader["image_name"].ToString(); string ext = Path.GetExtension(imgName).ToLower(); string mimeType = ext == ".png" ? "image/png" : "image/jpeg"; image1.ImageUrl = $"data:{mimeType};base64,{strbase64}"; } } con.Close();
修复存储逻辑后重新上传图片测试即可正常显示。
内容的提问来源于stack exchange,提问作者sweet
相关产品推荐
相关产品推荐

