ASP.NET调整上传图片存入数据库时报FileNotFoundException错误
问题根因
System.Drawing.Image.FromFile() 是服务端本地文件读取API,你代码中获取的 fuImage.PostedFile.FileName 是用户客户端设备上的本地文件路径,服务端磁盘不存在对应路径的文件,因此直接抛出FileNotFoundException异常。
修复方案
直接从上传文件的输入流加载图片,无需依赖客户端路径,也不需要提前把文件存到服务端磁盘。修改后的代码如下:
protected void Save(object sender, EventArgs e) { if (fuImage.HasFile) { Byte[] bytes; string contentType = fuImage.PostedFile.ContentType; string fileName = Path.GetFileName(fuImage.FileName); // 直接从上传流读取图片,替换原有的FromFile逻辑 using (System.Drawing.Image image = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream)) { // Resize image using (System.Drawing.Image thumbnail = image.GetThumbnailImage(130, 170, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero)) { using (MemoryStream memoryStream = new MemoryStream()) { thumbnail.Save(memoryStream, ImageFormat.Png); bytes = memoryStream.ToArray(); // 直接调用ToArray更简洁,不需要手动读 } } } // Insert uploaded image to Database string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { string query = "INSERT INTO tblFiles1 VALUES (@Name, @ContentType, @Data)"; using (SqlCommand cmd = new SqlCommand(query)) { cmd.Connection = con; cmd.Parameters.AddWithValue("@Name", fileName); cmd.Parameters.AddWithValue("@ContentType", contentType); cmd.Parameters.AddWithValue("@Data", bytes); con.Open(); cmd.ExecuteNonQuery(); con.Close(); } } } // Display image after upload to Database Image1.Visible = true; byte[] byteData = (byte[])GetData("SELECT Data FROM tblFiles1").Rows[0]["Data"]; string base64String = Convert.ToBase64String(byteData, 0, byteData.Length); Image1.ImageUrl = "data:image/png;base64," + base64String; } public bool ThumbnailCallback() { return false; }
额外注意事项
- 修复后的代码给
Image对象加了using释放资源,避免内存泄漏 - 原代码中手动读取流生成字节数组的逻辑可以直接替换为
MemoryStream.ToArray(),代码更简洁且不易出错 - 如果你使用的是.NET Core/.NET 5+版本,
System.Drawing.Common包仅支持Windows系统,跨平台部署需要替换为ImageSharp、SkiaSharp等跨平台图像处理库 - 请确认承载FileUpload的form表单设置了
enctype="multipart/form-data"、method="post"属性,否则可能出现上传文件为空的问题
内容的提问来源于stack exchange,提问作者notGoodAtThis
相关产品推荐
相关产品推荐

