如何在服务器端以二进制格式保存XML请求上传的文件?
解决HttpPostedFile二进制保存的问题
嘿,你的问题出在错误地读取了刚创建的空文件流,而不是读取上传文件的输入流。其实ASP.NET的HttpPostedFile已经提供了非常简便的方法来保存文件,也可以手动处理流来实现二进制保存,下面给你两种可行方案:
方案一:使用HttpPostedFile内置的SaveAs方法(最简单)
这是官方推荐的方式,内部已经封装了二进制保存的逻辑,直接一行代码就能搞定:
var httpPostedFile = System.Web.HttpContext.Current.Request.Files["MyFiles"]; var fileSave = System.Web.HttpContext.Current.Server.MapPath("SavedFiles"); Directory.CreateDirectory(fileSave); var fileSavePath = Path.Combine(fileSave, httpPostedFile.FileName); // 直接调用SaveAs即可完成二进制保存 httpPostedFile.SaveAs(fileSavePath);
方案二:手动处理流(自定义二进制读写)
如果你想手动控制流的读写过程,需要读取上传文件的InputStream,而不是你新建的空FileStream。可以这样写:
var httpPostedFile = System.Web.HttpContext.Current.Request.Files["MyFiles"]; var fileSave = System.Web.HttpContext.Current.Server.MapPath("SavedFiles"); Directory.CreateDirectory(fileSave); var fileSavePath = Path.Combine(fileSave, httpPostedFile.FileName); // 读取上传文件的输入流,写入到目标文件 using (var inputStream = httpPostedFile.InputStream) using (var fileStream = new FileStream(fileSavePath, FileMode.Create, FileAccess.Write)) { // 使用CopyTo方法复制流(.NET 4.0及以上支持) inputStream.CopyTo(fileStream); // 如果你需要手动读写字节,可以用下面的代码替代CopyTo: // byte[] buffer = new byte[4096]; // int bytesRead; // while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0) // { // fileStream.Write(buffer, 0, bytesRead); // } }
为什么你的代码会报错?
你之前的代码里,File.Create(fileSavePath)创建了一个空的文件流,然后用BinaryReader去读这个空流,fs.Length是0,所以b是一个空数组,之后再写入也没有意义。而且你完全搞反了数据源——应该读取上传文件的输入流(httpPostedFile.InputStream),而不是你新建的空文件流。
内容的提问来源于stack exchange,提问作者Karthik Ravichandran
相关产品推荐
相关产品推荐

