You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:06