文件输入框将图像上传到数据库

时间:2009-09-08 03:20:19

标签: database image upload

我的数据库中有一个类型为image的字段,在我的模型中映射为二进制(ADO.NET Entity Framework)。

但不知何故,我从输入文件框中获取的图像未传递给该对象。我知道这是因为我弄乱了我的动作和对象语言(我试图上传到数据库的图像是一个标志)将属性Flag设置为null,这非常糟糕!它应该包含上传的图像。我还需要做点什么吗?

下面是我的表单html代码和我的操作代码:

<% using (Html.BeginForm("Create", "Language", FormMethod.Post, 
          new {enctype="multipart/form-data"})) {%>
    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Id">Id:</label>
            <%= Html.TextBox("Id") %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Flag">Flag:</label>
            <!--
            File box is a helper that I got from this link:
            http://pupeno.com/blog/file-input-type-for-forms-in-for-asp-net-mvc/
            -->
            <%= Html.FileBox("Flag")  %>
            <%= Html.ValidationMessage("Flag", "*") %>
        </p>
        <p>
            <label for="IsDefault">IsDefault:</label>
            <%= Html.TextBox("IsDefault") %>
            <%= Html.ValidationMessage("IsDefault", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

我正在使用Visual Studio 2008。

[AcceptVerbs(HttpVerbs.Post)]  
public ActionResult Create(Language language)  
{  
    // Here language.Flag is null. Shouldn't the Flag property be a
    // binary field ready to be stored in the database along with the others?
    if (!ModelState.IsValid || !_service.CreateLanguage(language))  
    {  
        return View("Create", language);  
    }  
    return RedirectToAction("Index");  
}  

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我已经能够通过在我的action方法中添加HttpPostedFileBase参数来上传文件。在这种情况下,我不相信ASP.NET MVC会自动为您填充语言参数的属性。

答案 1 :(得分:1)

文件上传与普通帖子字段完全不同。您在Request.Files中上传了这些内容。我正在做这样的事情来拿起

if (Request.Files.Count != 1 || Request.Files[0].ContentLength == 0) {
    ModelState.AddModelError("Picture", "Picture is missing");
} else if (!IsImage(Request.Files[0].ContentType)) {
    ModelState.AddModelError("Picture", "The picture must be a JPEG or PNG");
} else {
    try {
        Save(Request.Files[0].InputStream);
    } catch {
        ModelState.AddModelError("Picture", "Something is wrong with the picture, we couldn't open it");
    }
}

IsImage和Save实际上比我的代码要复杂得多。如果要将其保存到模型和数据库,则需要convert the stream into a byte array

答案 2 :(得分:0)

感谢您的回复,但幸运的是我找到了更好的方法。

我改变了动作方法签名:
    的[AcceptVerbs(HttpVerbs.Post)]     public ActionResult Create(语言语言)

于:
    的[AcceptVerbs(HttpVerbs.Post)]     public ActionResult Create(HttpPostedFileBase Flag,Language language)

然后我将Flag文件名归因于language.Flag并且仅保留对文件所在位置的引用(这是因为我们决定保持数据库尽可能小,但我确信这个新签名也能正常工作将文件转换为数据库)。

希望这对其他人也有帮助!

抱歉,我不能给你竖起大拇指。声誉不够......