Repository navigation
OTR_FileUpload
nishi_74322014 edited this page Oct 27, 2026
·
1 revision
-
TOP > 使い方 > ファイルのアップロード
- ファイルのアップロード
- ファイルのダウンロード
Open 棟梁の P 層でのファイル・アップロード処理。
- ブラウザは
<input type="file">を使い、HTTP のマルチパート・メッセージ・ボディでファイルを送る(複数ファイルも可)。 - サーバ側は、P 層のイベント処理(UOC メソッド)で受け取って保存する。
- 受け取り方は、net48(ASP.NET Web Forms)と net10.0(ASP.NET Core)で異なる。
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 のストリーミング転送モードや分割アップロードで実装する。
| ファイルの大きさ | 受け取り方 |
|---|---|
| 小さい |
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: 再構築
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。