ASP.NET Web Forms部署服务器后图片上传报错:找不到指定文件
问题:ASP.NET Web Forms上传图片到数据库,发布到服务器后报错找不到文件
我开发了一个ASP.NET Web Forms应用程序,将上传的图片以二进制格式存储到数据库中,加载时将二进制数据转换为Base64字符串显示。在本地Visual Studio运行时一切正常,但发布到服务器后,选择文件上传时出现异常:Could not find file 'c:\windows\system32\inetsrv\download (2).jpg'。
原代码:
var ImageCode = tools.UploadFileToDatabase(file, "اخبار"); public int UploadFileToDatabase(HttpPostedFile file,string FileSubject) { var extension = GetFileExtension(file.FileName); byte[] ByteFile = FileToByteArray(file.FileName); BOLAmlakFiles bOLAmlakFiles = new BOLAmlakFiles(); var resultCode = bOLAmlakFiles.InsertFile(file.FileName, ByteFile, FileSubject, extension); return resultCode; } public byte[] FileToByteArray(string fileName) { byte[] fileContent = null; System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); long byteLength = new System.IO.FileInfo(fileName).Length; fileContent = binaryReader.ReadBytes((Int32)byteLength); fs.Close(); fs.Dispose(); binaryReader.Close(); return fileContent; } public int InsertFile(string name, byte[] content, string category, string FileExtension) { try { Files ObjTable = new Files(); dataContext.Files.InsertOnSubmit(ObjTable); ObjTable.Name = name; ObjTable.Content = content; ObjTable.Category = category; ObjTable.CreationDate = DateTime.Now; ObjTable.FileExtencion = FileExtension; dataContext.SubmitChanges(); dataContext.Connection.Close(); return ObjTable.Code; } catch (Exception) { return 0; } }
问题原因:
你在FileToByteArray方法中直接使用file.FileName作为文件路径创建FileStream。本地调试时,ASP.NET开发服务器能访问到本地客户端的文件路径;但部署到IIS后,file.FileName仅代表客户端上传的文件名,IIS进程会默认从服务器的c:\windows\system32\inetsrv\目录查找该文件,自然无法找到。
正确的做法是直接读取HttpPostedFile的InputStream,上传的文件已经在内存/临时存储中,无需依赖本地文件路径。
修复后的代码:
var ImageCode = tools.UploadFileToDatabase(file, "اخبار"); public int UploadFileToDatabase(HttpPostedFile file, string FileSubject) { var extension = GetFileExtension(file.FileName); // 直接从上传文件的InputStream读取字节数组 byte[] ByteFile = FileToByteArray(file); BOLAmlakFiles bOLAmlakFiles = new BOLAmlakFiles(); var resultCode = bOLAmlakFiles.InsertFile(file.FileName, ByteFile, FileSubject, extension); return resultCode; } // 修改方法,接收HttpPostedFile参数,直接读取流 public byte[] FileToByteArray(HttpPostedFile file) { byte[] fileContent = new byte[file.ContentLength]; file.InputStream.Read(fileContent, 0, file.ContentLength); return fileContent; } public int InsertFile(string name, byte[] content, string category, string FileExtension) { try { Files ObjTable = new Files(); dataContext.Files.InsertOnSubmit(ObjTable); ObjTable.Name = name; ObjTable.Content = content; ObjTable.Category = category; ObjTable.CreationDate = DateTime.Now; ObjTable.FileExtencion = FileExtension; dataContext.SubmitChanges(); // Linq to SQL会自动管理数据库连接,无需手动关闭 // dataContext.Connection.Close(); 移除该行 return ObjTable.Code; } catch (Exception) { return 0; } }
额外注意:
- 移除
dataContext.Connection.Close(),Linq to SQL会自动处理连接的打开与关闭,手动关闭可能引发后续数据库操作异常。 - 使用
InputStream读取内容的方式,适配本地调试和服务器部署两种场景,避免路径依赖问题。
内容的提问来源于stack exchange,提问作者PEDRAM POURHAKIM
相关产品推荐
相关产品推荐

