(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>