2

(ASP.NET 3.5 Web フォーム アプリ、データ アクセスに WCF サービス (Fluent NHibernate) を使用)

エンティティがあります。それを Foo と呼びましょう。ユーザーはファイルを添付ファイルとして Foo にアップロードできます。アップロードとダウンロードの機能は問題なく「動作」しています...1 つの問題があります...ファイルをダウンロードした後にファイルを開くと、ファイルが破損していることを知らせるエラー メッセージが表示されます。エラー メッセージで [OK] をクリックすると、.txt、.docx、および .xlsx ファイルは開きますが、他のすべてのファイル タイプは開きません。Google はあまり役に立ちませんでした。ここの誰かが私を正しい方向に向けてくれることを願っています。

アップロードコード:

// Attachment is a FileUpload control
if (Attachment.HasFile)
{
    HttpPostedFile file = Attachment.PostedFile;
    FooContract foo = FooService.LookupFoo(FooId.Value, CurrentUser.Id);
    int contentLength = file.ContentLength;

    // Allocate a buffer for reading the file
    byte[] fileData = new byte[contentLength];
    // Read uploaded file from the Stream
    file.InputStream.Read(fileData, 0, contentLength);

    FooAttachmentContract attachment = new FooAttachmentContract();
    attachment.FileSize = contentLength.ToString();
    attachment.FileName = Path.GetFileName(Attachment.FileName);
    attachment.ContentType = file.ContentType;
    attachment.FooId = foo.Id;
    _attachments.Add(FooService.AddFooAttachment(attachment, fileData, CurrentUser.Id));
    // Clear cache
    Session["Attachments"] = null;
    // Rebind grid
    BindAttachmentGrid();
}

ダウンロード コード:

...
if([user has permission])
{
    DownloadFileResponse response = FooService.RetrieveAttachment(attachmentId, CurrentUser.Id);
    DownloadAttachment(response.Attachment.ContentType, response.Attachment.FileName, response.FileBytes);
}
else
    AccessDenied();
...


protected void DownloadAttachment(string mimeType, string fileName, byte[] file)
{
    Response.Clear();
    Response.ContentType = mimeType;
    Response.AddHeader("content-disposition", string.Format("attachment;filename=\"{0}\"", fileName));
    Response.BinaryWrite(file);
    Response.Flush();
    Response.End();
}

テーブル:

Id          int (PK)
FooId       int (FK)
FileName    varchar(100)
FileBytes   varbinary(MAX)
ContentType varchar(100)
FileSize    bigint
IsDeleted   bit

----------------------更新 2013.05.07---------------------

私の投稿を再読した後、私はそれが明確ではないかもしれないことに気付きました...私はこれらのファイルをデータベースに保存しています.

データベースからバイトを取得すると、byte[] の長さは常に 8000 になり、正しくないようです。

Hibernate マッピング:

<?xml version="1.0"?>
-<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    -<class xmlns="urn:nhibernate-mapping-2.2" table="`FooAttachment`" name="MyWebApp.Domain.Model.FooAttachment, MyWebApp.Domain, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null"> 
        -<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="Id"/> <generator class="identity"/> </id> 
        -<property name="ContentType" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="ContentType"/> </property> 
        -<property name="CreatedBy" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="CreatedBy"/> </property> 
        -<property name="DateCreated" type="System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="DateCreated"/> </property> 
        -<property name="FileBytes" type="System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="FileBytes"/> </property> 
        -<property name="FileName" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="FileName"/> </property> 
        -<property name="FileSize" type="System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="FileSize"/> </property> 
        -<property name="IsDeleted" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="IsDeleted"/> </property> 
        -<property name="LastModified" type="System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="LastModified"/> </property> 
        -<property name="LastModifiedBy" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <column name="LastModifiedBy"/> </property> 
        -<many-to-one name="Foo" class="MyWebApp.Domain.Model.Foo, MyWebApp.Domain, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null"> <column name="FooId"/> </many-to-one> 
    </class> 
</hibernate-mapping>
4

1 に答える 1