2010-11-08 62 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