2

編集:

簡潔にするために、テーブルの作成スクリプトからキーの制約を除いたものを次に示します。

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

さらに情報が必要な場合はコメントしてください。

4

3 に答える 3

1

関連する質問に対するPeter Gluckの回答を使用して、NHibernateを引き続き使用して問題を解決しました。

var persistenceModel = AutoMap.AssemblyOf<Model.BaseModel>()
    .Override<Model.ProfileFile>(map =>
    {
        // Sets max length of byte[] retrieved from image column of DB
        map.Map(x => x.Data).Length(2147483647);
    })
    ... etc.
于 2012-06-28T14:50:41.833 に答える
0

次のように設定してみてくださいWeb.config

<system.web>
    <!--50MB-->
    <httpRuntime maxRequestLength="51200"/>
</system.web>

<system.webServer>
    <security>
        <requestFiltering>
            <!--50MB-->
            <requestLimits maxAllowedContentLength="52428795" />
        </requestFiltering>
    </security>
</system.webServer>

の説明については、この質問maxRequestLengthmaxAllowedContentLength参照してください。

于 2012-06-25T18:34:46.237 に答える
0
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <input id="file" type="file" name="file" />
  <input type="submit" value="Upload" class="btn" />
}

 public ActionResult ChangePhoto(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {

      using (System.Drawing.Image Img = System.Drawing.Image.FromStream(file.InputStream))
      {
         Img.Save(Server.MapPath("~") +"/myimage.png", Img.RawFormat);
      }
 }
于 2012-06-25T18:48:50.443 に答える