0

画像をアップロードするコードスニペットがあります。アップロード時に、ファイルを一時的にセッションに保存します。次に「保存」をクリックすると、ファイルがデータベースに保存されます。

私のマシンでは問題はありませんが、サーバーでいくつかのファイルをアップロードしようとして「保存」をクリックすると、「閉じたファイルにアクセスできません」というエラーが表示されます。グーグルで、これはアップロードされた大きなファイルが原因であるとここで読みました。確認したいのですが、大きなファイルをアップロードしているのが問題ですか?それとも何か他のものでしょうか?また、なぜこれを自分のマシンではなくサーバーでのみ取得するのですか?

編集:ちなみに、エラーはfile size > 80kb

ファイルのアップロードに関するコード:

public ActionResult StoreLogoInSession(HttpPostedFileBase file, int assetID)
        {
            string filename = null;
            if (ValidateOnUpload(file))
            {
                Session.Add("TempLogo", file);
                filename = file.FileName;
                Session.Add("filename", filename);
            }
            return RedirectToAction("Edit", new { id = assetID });
        }

保存に関するコード(これはエラーが発生したときです):

public ActionResult SaveLogo(LogoModel m, int assetID)
        {
                HttpPostedFileBase file = (HttpPostedFileBase)Session["TempLogo"];
                var logoModel = new LogoModel();
                var asset = this.GenerateAssetForUploadFile(file, (int)m.Asset.AccountID, m.Asset.TextContents, m.Asset.AssetName);
                this.LogoManagementFacade.SaveLogo(asset);
                logoModel.Asset = asset;
                this.LogoModelList.Add(logoModel);
}
4

1 に答える 1

0

この問題を修正するための最初のことは、セッションを取り除き、アップロードされたファイルをファイルシステムに一時的に保存することです。または、共有フォルダーのWebファームで実行している場合、またはファイルが十分に大きくない場合は、それらを保存することもできます。データベース内。

したがって、現在Webファームで実行しておらず、単一のWebサーバーがあり、アップロードされたファイルを一時フォルダーに保存できると仮定します(もちろん、毎晩実行して削除できるスケジュールされたスクリプトを作成します)。ディスクスペースを無駄にしないためにX日より古いファイル):

public const string AssetsFolderBase = "~/App_Data";

public ActionResult StoreLogo(HttpPostedFileBase file, int assetID)
{
    string filename = null;
    if (ValidateOnUpload(file))
    {
        var folder = Path.Combine(Server.MapPath(AssetsFolderBase), assetID.ToString());
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }
        folder = Path.Combine(folder, Path.GetFileName(file.FileName));
        file.SaveAs(folder);
    }
    return RedirectToAction("Edit", new { id = assetID });
}

そして、それにアクセスする必要があるとき:

public ActionResult SaveLogo(LogoModel m, int assetID)
{
    var folder = Path.Combine(Server.MapPath(AssetsFolderBase), assetID.ToString());
    var file = Directory.GetFiles(folder).FirstOrDefault();
    if (file == null)
    {
        // no file with this assetID was uploaded => throw an exception
        // or return 404 or something
        return HttpNotFound();
    }

    // at this stage the file variable is pointing to the uploaded filename
    // => you could process it here ...
}

ここで、大きなファイルのアップロードを処理する場合は、明らかにweb.configの適切な設定を調整する必要があります。デフォルトでは、4MBに制限されています。

ああ、web.configを編集している間は、他の開発者があなたと同じ間違いを犯して誤ってASP.NETセッションを使用しないように、次の行を追加してください。

<sessionState mode="Off" />
于 2012-07-26T13:12:10.980 に答える