編集:
簡潔にするために、テーブルの作成スクリプトからキーの制約を除いたものを次に示します。
CREATE TABLE [dbo].[ProfileFile](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ProfileID] [int] NOT NULL,
[FileTypeId] [int] NOT NULL,
[Data] [image] NOT NULL
編集:
NHibernate をバイパスしてサービス層のデータにアクセスしようとしています
byte[] temp = (byte[])this._baseModelRepository.CurrentSession.CreateSQLQuery("SELECT Data FROM ProfileFile WHERE ProfileID = :ID").SetParameter("ID", id).UniqueResult();
EDIT: dbに保存されたバイナリデータを確認したところ、ファイル全体がアップロードされているようで、私の問題は実際には画像を表示する側にあるようです。
画像はレンダリングされませんが、アクション リンクをたどってファイルをダウンロードできますが、8KB で切り捨てられます。
ProfileFile モデル クラス NHibernate によって生成されるデータ フィールド
public virtual System.Byte[] Data { get; set; }
このセットアップを行う際に、MIME タイプとファイル名をハードコーディングしました。
public ActionResult GetProfilePhotoByID(int profileID)
{
var profileFile= //Load file object from DB by profileID
byte[] byteArray = profileFile.Data;
string mimeType = "image/jpg";
string fileName = "ProfilePhoto.JPG";
return File(byteArray, mimeType, fileName);
}
デバッガーを使用すると、profileFile.Data のサイズが 8000 であることがわかりました。これは NHibernate の制限でしょうか?
また、これは IIS で実行されており、Chrome、Firefox、および IE でも同じ効果が得られていますが、主に Chrome でテストしています。
元の質問: ユーザーがプロフィール写真をアップロードできるようにしようとしています。後でそれをプロフィール ページに掲載します。残念ながら、画像ファイルは完全にアップロードされておらず、8 KB で途切れています。以下は、より重要なコード セグメントの一部を簡略化したものです。
インデックス ビュー スニペット
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { id = "profileform", enctype = "multipart/form-data" }))
<input type="file" id="photo" name="photo" />
コントローラー ポスト アクションにはHttpPostedFileBase photo
パラメーターがあります
byte[] input;
if (photo != null && photo.ContentLength > 0)
{
input = new byte[photo.ContentLength];
photo.InputStream.Read(input, 0, photo.ContentLength);
if (model.ProfileFiles == null)
{
model.ProfileFiles = new List<Core.Model.ProfileFiles>();
}
model.ProfileFiles.Add(new Core.Model.ProfileFiles()
{
ProfileID = model.ID,
Profile = model,
Data = input
});
}
Model クラスは NHibernate で生成されます。該当するフィールドは
// One To Many:
public virtual IList<ProfileFile> ProfileFiles { get; set; }
さらに情報が必要な場合はコメントしてください。