1

私はこのコードを使用して画像をサーバーにアップロードし、データベースに保存します:
データベースの列はbinary(max)だと思いますが、ファイルをアップロードしてデータベースから読み取ろうとすると、合計バイト配列(ファイルストリーム)の一部のみが読み取られます)がデータベースに保存されます。

    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);
                                                   }));
                                  });
    }
}

詳細については、Binary Blob truncated to 8000 bytes - SQL Server 2008 / varbinary(max)およびデータベースに画像を保存すると部分的な画像になるを参照してください。

于 2012-07-05T11:27:52.240 に答える
0

byte[] を返す GetBuffer() を使用する必要があるかもしれません。

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

備考: バッファーには、未使用の可能性がある割り当てられたバイトが含まれていることに注意してください。

ToArray はこれらのバイトを省略します。

于 2012-07-04T00:41:34.067 に答える