上传后在页面上显示图像

时间:2014-12-14 21:47:54

标签: c# asp.net-mvc image file-upload

当用户上传图片并点击保存时,我的页面上传了一个文件,并将其作为BYTE存储在数据库中

当视图返回时,我传回BYTE尝试显示图像,但我不断收到以下错误

类型' System.Web.HttpException'的例外情况发生在System.Web.dll中但未在用户代码中处理 附加信息:执行处理程序的子请求时出错' System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'。

我看一下内部异常,如下所示

输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符。

我过去曾在其他未能引起问题的项目中使用此代码

这是我的观点非常基本它有其他控件但为了简单起见我只会显示文件上传

  @if (ViewBag.ImageData != null)
        {
            <div class="control-group">
                <label class="control-label" for="WebAddress">
                    Preview
                </label>
                <div class="controls">
                    <img src="data:image;base64,@System.Convert.ToBase64String(Model.RetailerImage)" width="80" height="80" />
                </div>
            </div>
        }

这是我的控制器

 [AuthorizeRolesAttribute(RoleType.Retailer)]
    [HttpPost]
    public ActionResult EditStoreProfile(Retailer retailer)// ,string[] selectedBrands)
    {
        if (ModelState.IsValid)
        {
            if (Request.Files.Count > 0)
            {
                var file = Request.Files[0];

                if (file != null)
                {
                    int ContentLength = file.ContentLength;

                    // Create Byte Array
                    byte[] bytImg = new byte[ContentLength];

                    // Read Uploaded file in Byte Array
                    file.InputStream.Read(bytImg, 0, ContentLength);

                    ViewBag.ImageData = bytImg;
                    retailer.RetailerImage = bytImg; // Store image byte in model ready for saving in the db, this will also be passed back to the view to be displayed as a preview
                }
            }

            try
            {
                //  retailer.RetailersProductBrands = GetRetailerBrands(selectedBrands, retailer.RetailerID);
                UnitOfWork.Retailer.Save(retailer);

                // UnitOfWork.RetailersProductBrandsRepository.DeleteExistingRetailerProductBrands(retailer.RetailerID);

                Retailer updatedRetails = UnitOfWork.Retailer.GetRetailer(retailer.RetailerID);
                //Email notification to administrator
                new MailController().NotifyStoreProfileUpdate(updatedRetails).Deliver();

                return RedirectToAction("Index");
            }
            catch (Exception)
            {
                ModelState.AddModelError(string.Empty, Constant.GenericErrorMessage);
                return View(retailer);
            }
        }

        PopulateViewBags();
        return View(retailer);
    }

但我不确定这里出了什么问题

1 个答案:

答案 0 :(得分:1)

HttpPostedFileBase的{​​{1}}并不总是在InputStream的单个调用中返回所有字节。您很可能只是部分获取该文件。

使用

Read