Skip to content

OTR_FileUpload

nishi_74322014 edited this page Oct 27, 2026 · 1 revision

ファイルのアップロード

概要

Open 棟梁の P 層でのファイル・アップロード処理。

  • ブラウザは <input type="file"> を使い、HTTP のマルチパート・メッセージ・ボディでファイルを送る(複数ファイルも可)。
  • サーバ側は、P 層のイベント処理(UOC メソッド)で受け取って保存する。
  • 受け取り方は、net48(ASP.NET Web Forms)と net10.0(ASP.NET Core)で異なる。

詳細

net48(Web Forms)

Request.Files(HttpPostedFile)で受け取る。

protected string UOC_btnUpload_Click(FxEventArgs fxEventArgs)
{
    HttpPostedFile posted = Request.Files["userfile"];

    if (posted != null && posted.ContentLength > 0)
    {
        // 保存するファイル名はアプリ側で決める(ユーザ提供の名前を使わない)
        string fileName = Guid.NewGuid().ToString("N") + ".dat";
        posted.SaveAs(Path.Combine(uploadDirectory, fileName));
    }
    return "";
}
  • アップロード中のデータは ASP.NET プロセスのメモリ(またはディスク)に溜まる。巨大なファイルや多重度でメモリ不足になりうる。
  • Web.config で最大サイズを制限する。ブラウザは Content-Length を付けるので、超過する要求は受信前に拒否できる。
<!-- KB 単位。既定は 4096(4MB) -->
<httpRuntime maxRequestLength="4096" executionTimeout="90" />
<!-- IIS 側の制限(バイト単位)も効く -->
<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="4194304" />
    </requestFiltering>
  </security>
</system.webServer>
  • 大規模なデータは、WCF のストリーミング転送モードや分割アップロードで実装する。

net10.0(ASP.NET Core)

ファイルの大きさ 受け取り方
小さい IFormFile(バッファリング)
大きい MultipartReader / Request.Body によるストリーミング
  • サイズの制限は [RequestSizeLimit] / [RequestFormLimits]、FormOptions.MultipartBodyLengthLimit、Kestrel の MaxRequestBodySize で行う。

セキュリティ

  • サイズを制限する(メモリ枯渇の対策)。
  • 拡張子は許可リストで検査し、中身(マジックバイト)も確認する。 拡張子と Content-Type は詐称できる。
  • 保存するファイル名はアプリが決める(GUID など)。ユーザ提供のファイル名をパスに使うとパストラバーサルになる。表示やログでは HTML エンコードする。
  • 保存先は公開ディレクトリ(wwwroot)の外にし、実行権限を外す。
  • 認証済みのユーザだけに許可する。可能ならウイルス・スキャンを行う。

コーディング・エージェントに任せる場合

  • 設計はスキル opentouryo-app-design(references/file-upload-download.md)、実装は P 層のスキル
    (opentouryo-layer-p-webforms-event / opentouryo-layer-p-mvc)を使わせる。
  • エージェントはユーザ提供のファイル名をそのまま使いがちなので、上記のセキュリティ項目をレビューで確認する。

参考


Tags: 再構築

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki
開発基盤部会 Wiki

移行管理: DONE / TODO

Clone this wiki locally