如何将HttpPostedFileBase对象保存为磁盘文件?该文件的名称应该是发送给该组的警报的ID
private static string SaveSharedFile(int userAlertId, HttpPostedFileBase file)
{
string fileName = null;
fileName = System.IO.Path.GetFileName(file.FileName);
if (fileName != "")
{
BinaryReader br = new BinaryReader(file.InputStream);
byte[] buffer = br.ReadBytes(file.ContentLength);
br.Close();
//Save HttpPostedFileBase object as file at c://Path/Folder should have userAlertId name
}
return fileName;
}
感谢您的帮助
答案 0 :(得分:4)
如果有可能进行大量上传,我建议不要使用HttpPostedFileBase.InputStream或File.WriteAllBytes。这两种方法都会将整个上传内容加载到服务器上的内存中,然后再将其交给您的代码。
更有效的方法是使用System.Web.HttpContext.Current.Request.GetBufferlessInputStream()将文件读入流中,并根据您指定的buffersize写入缓冲区。这也使您可以选择在使用第二个流时将文件直接写入磁盘 ,从而最大限度地减少内存使用和时间。
以下是一个例子:
private static string SaveSharedFile(int userAlertId, HttpPostedFileBase file)
{
string fileName = null;
fileName = System.IO.Path.GetFileName(file.FileName);
if (fileName != "")
{
const int BufferSize = 65536; // 65536 = 64 Kilobytes
string Filepath = userAlertId.ToString();
using (FileStream fs = System.IO.File.Create(Filepath))
{
using (Stream reader = System.Web.HttpContext.Current.Request.GetBufferlessInputStream())
{
byte[] buffer = new byte[BufferSize];
int read = -1, pos = 0;
do
{
int len = (file.ContentLength < pos + BufferSize ?
file.ContentLength - pos :
BufferSize);
read = reader.Read(buffer, 0, len);
fs.Write(buffer, 0, len);
pos += read;
} while (read > 0);
}
}
}
return fileName;
}
编辑:“文件”变量仍然用于读取像file.ContentLength这样的内容,但在我的示例中,GetBufferlessInputStream()只是另一个阅读帖子的地方(假设帖子)只是文件,文件头可以保存表单值),允许您选择一次缓冲多少。
如果文件与表单一起发布,您可能只需要再次将“... GetBufferlessInputStream()”替换为“file.InputStream()”。但是,如果您在阅读缓冲区时仍在编写缓冲区而不是缓冲缓冲区(如在原始问题中那样),那么它可能仍然足以满足您的需求。