2010-11-08 59 views
3

我有点问题上传文件到数据库。我上传到该表的结构如下:文件上传和保存到数据库不正确

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,所以我重写了一下。我没有做出任何重大改变,但从我的代码可以看出,所以我不知道为什么会发生这种情况。

我在我的应用程序中插入了断点,以查看字节数组是否实际上被填充,这是只有零。 alt text

封面控制器

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> 

回答

2

可能是因为你没有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); 
+0

嗨,猎人。感谢您的回复。我将在明天再次在办公室时尝试这一点。只是一个简短的问题,你认为Close()是什么意思?谢谢,T. – 109221793 2010-11-08 20:08:48

+0

将'Stream'封装在'using'块中会在它离开这个将调用'Close()'的块时调用Dispose()。这只是确保你已经发布了这个资源。可能还有其他一些问题,但这是一个好的开始。 – hunter 2010-11-08 20:17:46

+0

很酷,谢谢亨特。将在早上尝试一下,然后更新它。 – 109221793 2010-11-08 20:20:26