ASP.NET上传图片时识别不到选中文件且报未将对象引用设置到对象实例错误
问题原因及修复方案
核心错误点
- 提交表单缺少文件上传必需的属性,需要在.aspx页的
<form>标签上添加enctype="multipart/form-data",否则表单不会传输文件内容,后端自然获取不到选中的文件 FindControl用法错误,只要你的FileUpload控件没有嵌套在母版页、数据控件(GridView/Repeater等)、用户控件这类容器里,不需要手动FindControl,直接用控件IDfileImg就能访问,你写的FindControl大概率返回了null,调用.HasFile的时候就触发了空引用错误- 存储过程参数重复添加了
@UsrID,你先后加了两次同一个参数,分别赋值txtUsrID.Text和_UsrName,会导致执行存储过程报错 - 路径和操作逻辑顺序有问题,你先把文件存到UsrImage目录,之后又判断配置的ImagesFolder路径下有没有同名文件要删除,最后再存一次到配置路径,逻辑混乱,且需要确认对应目录有写入权限
修复步骤
1. 修改.aspx页的表单配置
找到你页面的<form>标签,补充上传必需属性:
<form id="form1" runat="server" enctype="multipart/form-data"> <!-- 原有页面内容保持不变 --> </form>
你现有FileUpload控件的代码无需修改。
2. 替换后端C#代码
protected void ButImg_Click(object sender, EventArgs e) { // 直接用控件ID访问,不需要FindControl if (fileImg.HasFile) { try { string imgfile = Path.GetFileName(fileImg.PostedFile.FileName); // 读取配置的存储路径 string configSavePath = Path.Combine(ConfigurationManager.AppSettings["ImagesFolder"], imgfile); // 先删除旧文件(如果存在) if (System.IO.File.Exists(configSavePath)) { System.IO.File.Delete(configSavePath); } // 保存到UsrImage目录,提前确认站点根目录下存在UsrImage文件夹 string usrImgPath = Server.MapPath("~/UsrImage/" + imgfile); fileImg.SaveAs(usrImgPath); // 保存到配置的目录 fileImg.SaveAs(configSavePath); _connstr = System.Configuration.ConfigurationManager.ConnectionStrings["Conn"].ConnectionString; // 用using自动释放数据库连接,不需要手动Close using (SqlConnection sqlconn = new SqlConnection(_connstr)) { sqlconn.Open(); SqlCommand sqlcomm = new SqlCommand(_procUpdateImage, sqlconn); sqlcomm.CommandType = CommandType.StoredProcedure; // 删掉重复的@UsrID参数,根据业务需求保留其中一个赋值即可 sqlcomm.Parameters.AddWithValue("@UsrID", this.txtUsrID.Text); sqlcomm.Parameters.AddWithValue("@ImageName", imgfile); sqlcomm.Parameters.AddWithValue("@ImagePath", "Images/" + imgfile); sqlcomm.ExecuteNonQuery(); LitImg.Text = "Image saved successfully"; } } catch (Exception ex) { LitImg.Text = "保存失败:" + ex.Message; } } else { LitImg.Text = "Image not saved successfully,请先选择要上传的图片"; } }
额外注意事项
- 确认Web.config里已经配置了
AppSettings节点的ImagesFolder值,路径要使用绝对路径或者正确的相对路径,同时对应的目录要给IIS运行用户(比如IIS_IUSRS)开通写入权限 - 如果确实需要保留
_UsrName作为@UsrID的参数值,把参数赋值部分改成sqlcomm.Parameters.AddWithValue("@UsrID", _UsrName);即可,不要重复添加同一个参数 - 如果你确实把FileUpload放在了母版页或者其他容器里,需要调整FindControl的层级,比如放在母版页的ContentPlaceHolder里的话,要写成
FileUpload fileImg = (FileUpload)Master.FindControl("ContentPlaceHolder1").FindControl("fileImg");,不要直接用this.FindControl
内容的提问来源于stack exchange,提问作者Newb
相关产品推荐
相关产品推荐

