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

如何在服务器端以二进制格式保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:27