Repository navigation
OTR_FileDownload
nishi_74322014 edited this page Oct 27, 2026
·
1 revision
-
TOP > 使い方 > ファイルのダウンロード
- ファイルのアップロード
- ファイルのダウンロード
Open 棟梁の P 層でのファイル・ダウンロード処理。
- Web サーバでファイルを直接 GET させる方法と、AP サーバで HTTP レスポンスにファイルを書き込む方法がある。
- ここでは後者を説明する。書き込み方は、net48(ASP.NET Web Forms)と net10.0(ASP.NET Core)で異なる。
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 にする |
コントローラから 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: 再構築
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。