在MVC 4中保存/显示图像时遇到一些问题

时间:2013-04-28 19:23:25

标签: sql-server image asp.net-mvc-4 bytearray

我现在已经搜索了一段时间,没有任何快乐。我试图将图像保存为我的SQL数据库作为字节数组,然后我试图稍后显示它。显示部分不工作。我不知道保存或显示是否有问题。保存似乎工作正常,我可以在我的SQL表中看到'二进制数据'。有什么建议?

发生的事情是我的页面上出现了破损的图片图标。即使我手动转到网址,例如... / Treatments / LoadImage / 14它坏了。

模型在我的表定义中包含此内容:

public byte[] Photo { get; set; }

创建视图:

<div class="editor-label">
    @Html.LabelFor(model => model.Photo)
</div>
<div class="editor-field">
    <input type="file" name="photo" />
</div>

创建控制器:

    [HttpPost]
    public ActionResult Create([Bind(Exclude = "Photo")]Treatment treatment)
    {
        if (ModelState.IsValid)
        {
            treatment.Photo = GetByteArrayFromFile();
            treatment.WebOrder = db.Treatments.Count();
            db.Treatments.Add(treatment);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.TreatmentTypeId = new SelectList(db.TreatmentTypes, "Id", "Name", treatment.TreatmentTypeId);
        return View(treatment);
    }

    private byte[] GetByteArrayFromFile() {
        int fileLength = Request.Files["photo"].ContentLength;
        byte[] byteArray = new byte[fileLength];

        return byteArray;
    }

显示视图:

    <div class="display-label">
            @Html.DisplayNameFor(model => model.Photo)
    </div>
    <div class="display-field">
        <img src="@Url.Action("LoadImage", new { Id = Model.Id })" />
    </div>

LoadImage控制器:

    public ActionResult LoadImage(int Id) {
        byte[] bytes = db.Treatments.Find(Id).Photo;
        return File(bytes, "image/jpeg");
    }

我已添加:

@using (Html.BeginForm("Create", "Treatments", FormMethod.Post, new { enctype = "multipart/form-data" })) {
    // View Code Omitted
}

到我的创建视图。

我的代码有什么问题吗?有什么建议?感谢。

1 个答案:

答案 0 :(得分:0)

我的GetByteArrayFromFile方法存在问题。我上面的原始方法只返回了一个零数组。使用这个,我解决了我的问题:

        private byte[] GetByteArrayFromFile() {
            WebImage image = WebImage.GetImageFromRequest();
            byte[] byteArray = image.GetBytes();

            return byteArray;
        }