文件上传和保存到数据库不正确
问题描述:
我有点问题上传文件到数据库。我上传到该表的结构如下:文件上传和保存到数据库不正确
dbo.Cover
CoverID int PK
CoverFileContent varbinary(max)
CoverMimeType nvarchar(50)
CoverFileName nvarchar(50)
FileID int FK
我可以用我的MVC应用程序没有任何错误上传文件,但在数据库中CoverFileContent的文件存储为“0x0000000000000000 ...... ”。与文件有关的所有其他信息,例如MimeType,FileName,CoverID等正确上传。我大肆猜测这是不正确的,所以我下载了该文件(创建了一个.net MVC下载程序)。它似乎下载为正确类型的文件,但是当我试图打开它时,它告诉我我无法打开它。
这是我的原始教程如下:Tutorial。我已经完成了这个工作,但是我想使用ADO.net,所以我重写了一下。我没有做出任何重大改变,但从我的代码可以看出,所以我不知道为什么会发生这种情况。
我在我的应用程序中插入了断点,以查看字节数组是否实际上被填充,这是只有零。
封面控制器
public ActionResult CreateCover(int id)
{
Cover cover = new Cover();
cover.FileID = id;
return View(cover);
}
//
//POST: /File/CreateCover
[HttpPost]
public ActionResult CreateCover(Cover cover)
{
cover.CoverMimeType = Request.Files["CoverUpload"].ContentType;
Stream fileStream = Request.Files["CoverUpload"].InputStream;
cover.CoverFileName = Path.GetFileName(Request.Files["CoverUpload"].FileName);
int fileLength = Request.Files["CoverUpload"].ContentLength;
cover.CoverFileContent = new byte[fileLength];
fileStream.Read(cover.CoverFileContent, 0, fileLength);
cover.FileID = int.Parse(Request.Form["FileID"]);
filerepository.AddCoverData(cover);
filerepository.Save();
return View(cover);
//return View("CreatePdf", "Pdf", new { id = cover.FileID });
}
CreateCover.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SampleApp.Models.Cover>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
CreateCover
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>CreateCover</h2>
<% using (Html.BeginForm("CreateCover", "Cover", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ %>
<%: Html.HiddenFor(model => model.FileID) %>
<asp:Label ID="Label2" runat="server" Text="Please Select your eBook Cover" /><br />
<input type="file" name="CoverUpload" /><br />
<input type="submit" name="submit" id="Submit" value="Upload" />
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
答
可能是因为你没有Close()
-ing你Stream
HttpPostedFileBase file = Request.Files["CoverUpload"];
cover.CoverMimeType = file.ContentType;
cover.CoverFileName = Path.GetFileName(file.FileName);
cover.FileID = int.Parse(Request.Form["FileID"]);
byte[] input = new byte[file.ContentLength];
using (Stream s = file.InputStream)
{
s.Read(input, 0, file.ContentLength);
}
cover.CoverFileContent = input;
filerepository.AddCoverData(cover);
filerepository.Save();
return View(cover);
嗨,猎人。感谢您的回复。我将在明天再次在办公室时尝试这一点。只是一个简短的问题,你认为Close()是什么意思?谢谢,T. – 109221793 2010-11-08 20:08:48
将'Stream'封装在'using'块中会在它离开这个将调用'Close()'的块时调用Dispose()。这只是确保你已经发布了这个资源。可能还有其他一些问题,但这是一个好的开始。 – hunter 2010-11-08 20:17:46
很酷,谢谢亨特。将在早上尝试一下,然后更新它。 – 109221793 2010-11-08 20:20:26