ファイルをアップロードしてサイズを判断するときに注意すべき点


以前、アップロードファイルを書くときにファイルのサイズを判断するには、次のようなコードが使用されていました.
if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0 && Request.Files[0].ContentLength <= maxPictureSize)
{}
最近になって、IISはすべてのブラウザから送信されたデータ(Request.FormまたはRequest.BinaryReadがIIS処理要求データをもたらす)を処理したことを知った.つまり、ファイルがサーバに受信された場合、ファイルサイズが事後判断に属していると判断し、正しい判断は以下の通りである.
long fileLength = long.Parse(Request.Headers["Content-Length"]);
if(fileLength<maxPictureSize && Request.Files.Count > 0 && Request.Files[0].ContentLength > 0)
{}

このようにすると、ファイルが大きいと判断されると一定の誤差があります.このlengthにはファイル以外のデータも含まれていますが、基本的な誤差は許容範囲内です.このような利点は、ファイルが本当にサーバにアップロードされてからサイズ判断を行うことを直接避けることです.
このような原理は、IISが要求データを処理する際に、上から順に実行する、Requestである.HeadersはRequestと実行するFormは関係ない、つまりRequestを実行した.HeadersはIISがコミットしたデータを処理することはありません
ついでに、ファイルタイプの判断ルールを補足します.
//  Request.Files[0].ContentType        ,         
//           ,        jpg,         ContentType  "image/jpeg"   "image/pjpeg"
//          jpg  ,            
//byte[] bytes = new byte[2];
//             bytes
//  string.Format("{0}{1}",bytes[0],bytes[1]);
//255216 jpg;7173 gif;6677 BMP,13780 PNG;7790 exe,8297 rar

指定ファイル名としてダウンロード
string fileName = "test.xls";
Response.ContentType = "application/vnd.ms-excel";
Response.Charset = "gb2312";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);