文件上传及保存到数据库出现错误

3

我在上传文件到数据库时遇到了一些问题。我要上传的表格结构如下:

dbo.Cover
CoverID           int PK
CoverFileContent  varbinary(max)
CoverMimeType     nvarchar(50)
CoverFileName     nvarchar(50)
FileID            int FK

我可以在我的MVC应用程序中上传文件而没有任何错误,但是在数据库中,文件以"0x0000000000000000......"的形式存储在CoverFileContent中。与文件相关的所有其他信息,例如MimeType、FileName、CoverID等都正确上传。我猜想这不正确,所以我下载了文件(创建了一个.net MVC下载器)。它似乎以正确的文件类型下载,但是当我尝试打开它时,它告诉我无法打开它。
这是我遵循的原始教程:教程。我已经完美地解决了这个问题,但是我想使用ADO.net,所以我稍微重写了一下。我没有做任何重大更改,但是从我的代码中可以看出,所以我不知道为什么会发生这种情况。
我在我的应用程序中插入了断点,以查看字节数组是否实际被填充,发现它只有零。 Cover Controller
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>
1个回答

2
可能是因为您没有关闭流(Stream)的原因。请在使用完流(Stream)后,调用Close()函数。
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);

嗨 Hunter,谢谢你的回复。我明天再去办公室时会尝试这个。只是一个快速的问题,你所说的 Close() 关闭流是什么意思?谢谢,T。 - 109221793
Stream包装在一个using块中,当它离开该块时会调用Dispose()函数并进而调用Close()。这只是确保您已释放此资源。可能还有其他问题,但这是一个不错的开始。 - hunter
好的,谢谢Hunter。我明天会试一下并向您更新情况。 - 109221793
非常成功。再次感谢 :) - 109221793

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接