1

我使用此代码将图像上传到服务器并存储在数据库中:
认为数据库列是二进制(最大),当我上传一个文件并尝试从数据库中读取它时,只读取总字节数组的一部分(文件流) 被保存到数据库中。

    public virtual ActionResult CreateService(Service service, HttpPostedFileBase serviceImage )
    {
        if (ModelState.IsValid)
        {
            if (serviceImage != null)
            {
                var target = new MemoryStream();
                serviceImage.InputStream.CopyTo(target);
                service.Image = target.ToArray();
            }

            _serviceTask.AddNewItem(service); // Inserting new entity using NHibernate
        }
        return RedirectToAction("Index");
    }

一切正常,但是当我尝试从数据库中检索它并将其显示给用户时,我得到的图像不完整。例如,用户上传了这张图片: 上传的图片 但是当我检索它时,我得到这个图片
我已将数据库图像列设置为 varbinary(max) 我也尝试了图像数据类型。这是我的表单代码:

 @using (Html.BeginForm("CreateService", "Services", FormMethod.Post, new { @id = "dialogForm", @class = "mws-form", @enctype = "multipart/form-data" }))
    {
    <input type="file" name="serviceImage" />
     }

我该如何解决?

4

2 回答 2

1

正如 Darin Dimitrov 所说,问题出在 DAL 中。假设您使用的是 NHibernate 3.2 和 SQL 2008,您必须检查数据库字段类型和 NHibernate 映射。必须将数据库字段类型设置为Varbinary(MAX)并且映射必须显式声明列长度。

就像以下(通过代码映射):

    internal class ServiceOverride : IOverride
{
    public void Override(ModelMapper mapper)
    {
        mapper.Class<Service>(map =>
                                  {
                                      map.Property(x => x.Image,
                                                   status => status.Column(c =>
                                                   {
                                                       c.SqlType("VARBINARY(MAX)");
                                                       c.Length(int.MaxValue);
                                                   }));
                                  });
    }
}

有关更多信息,请访问二进制 Blob 截断为 8000 字节 - SQL Server 2008 / varbinary(max)在数据库中存储图像会导致部分图像

于 2012-07-05T11:27:52.240 回答
0

也许你应该使用 GetBuffer(),它返回一个 byte[]

http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

在备注中:请注意,缓冲区包含可能未使用的已分配字节。

ToArray 省略了这些字节。

于 2012-07-04T00:41:34.067 回答