Skip to content

OTR_FileDownload

nishi_74322014 edited this page Oct 27, 2026 · 1 revision

ファイルのダウンロード

概要

Open 棟梁の P 層でのファイル・ダウンロード処理。

  • Web サーバでファイルを直接 GET させる方法と、AP サーバで HTTP レスポンスにファイルを書き込む方法がある。
  • ここでは後者を説明する。書き込み方は、net48(ASP.NET Web Forms)と net10.0(ASP.NET Core)で異なる。

詳細

net48(Web Forms)

Response.Clear() → ヘッダの設定 → 本体の書き込み → 終了、の順で行う。

protected override void UOC_FormInit()
{
    // HTTP レスポンスのヘッダ&エンティティをクリア
    Response.Clear();

    // MIME タイプ
    Response.ContentType = "application/pdf";
    // キャッシュ無効化
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    // attachment:保存ダイアログ / inline:ブラウザで表示
    Response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf");

    // 本体
    Response.WriteFile(
        Path.Combine(GetConfigParameter.GetConfigValue("TestFilePath"), "test.pdf"));

    // 終了
    Response.End();
}
項目 ポイント
本体の書き込み 小さいファイルは WriteFile / BinaryWrite。大きいファイルは TransmitFile か Response.OutputStream.Write(WriteFile はメモリに載せるため失敗することがある)
Response.End() 受信途中でクライアントが接続を切ると HttpException: The remote host closed the connection が出ることがある。必要なら try ~ catch で正常終了させるか、CompleteRequest を使う
日本語ファイル名 ブラウザ差異があるので、filename*=UTF-8''<パーセントエンコード>(RFC 6266 / 5987)と ASCII の filename= を併記する
一時ファイル 一時ファイルを返してすぐ消すなら、FileStream でバッファに読み込み、finally で削除してから BinaryWrite する。一時ファイル名は GUID にする

net10.0(ASP.NET Core)

コントローラから File(...)(FileStreamResult / PhysicalFileResult)を返す。

public IActionResult Download(int id)
{
    // ID → パスの対応表から引く(ユーザ入力からパスを組み立てない)
    string path = this.ResolveDownloadPath(id);
    return PhysicalFile(path, "application/pdf", "報告書.pdf", enableRangeProcessing: true);
}
  • Content-Disposition、ファイル名のエンコード、Range(レジューム)、ETag はフレームワークが処理する。手書きより安全である。

セキュリティ

  • パストラバーサル:ファイルのパスをユーザ入力から直接組み立てない。ID とパスの対応表にするか、解決後のパスが許可ディレクトリ内かを検証する。
  • 認可:そのユーザがそのファイルを取得してよいかを確認する(任意ファイル・ダウンロードの防止)。
  • Content-Type は安全な対応表から決め、X-Content-Type-Options: nosniff を付ける。

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

  • 設計はスキル opentouryo-app-design(references/file-upload-download.md、cache-control.md)、
    実装は P 層のスキル(opentouryo-layer-p-webforms-screen / opentouryo-layer-p-mvc)を使わせる。
  • パスの組み立てと認可は、エージェントの実装で抜けやすいので、レビューで確認する。

参考


Tags: 再構築

NetDevInfraWiki

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

移行管理: DONE / TODO

Clone this wiki locally