通常處理程序上傳文件(html表單上傳、aspx頁面上傳)

html 表單上傳文件

       通常處理程序因爲沒有 apsx 頁面的整個模型和控件的建立週期,而比較有效率。這裏寫一個用 html 表單進行文件上傳的示例。html

       1. 表單元素選用 <input type="file"> 控件。web

       2. form 表單須要設置 enctype="multipart/form-data" 屬性,請求報文體中數據格式也由鍵值對更改成數據頭和數具體,並有隨機邊界符分割。服務器

       3. 服務器端接收文件使用 Request.Files 屬性。app

       4. 使用 HttpPostedFile 的 SaveAs 方法保存文件(需轉換成網站物理路徑)。ide

 

 

<body>
    <form action="UploadFile.ashx" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload" />
    <input type="submit" value="上傳文件" />
    </form>
</body>
public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    HttpServerUtility server = context.Server;
    HttpRequest request = context.Request;
    HttpResponse response = context.Response;
 
    HttpPostedFile file = context.Request.Files[0];
    if (file.ContentLength > 0)
    {
        string extName = Path.GetExtension(file.FileName);
        string fileName = Guid.NewGuid().ToString();
        string fullName = fileName + extName;
 
        string imageFilter = ".jpg|.png|.gif|.ico";// 隨便模擬幾個圖片類型
        if (imageFilter.Contains(extName.ToLower()))
        {
            string phyFilePath = server.MapPath("~/Upload/Image/") + fullName;
            file.SaveAs(phyFilePath);
            response.Write("上傳成功!文件名:" + fullName + "<br />");
            response.Write(string.Format("<img src='Upload/Image/{0}'/>", fullName));
        }
    }
}

 

 

html 表單批量上傳文件

       若是要實現批量上傳,須要重構通常處理程序中文件保存的邏輯以代碼重用,或者在上述代碼中增長循環 Files 集合:post

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    HttpServerUtility server = context.Server;
    HttpRequest request = context.Request;
    HttpResponse response = context.Response;
 
    HttpFileCollection files = context.Request.Files;
 
    for (int i = 0; i < files.Count; i++)
    {
        if (files[i].ContentLength > 0)
        {
            string extName = Path.GetExtension(files[i].FileName);
            string fileName = Guid.NewGuid().ToString();
            string fullName = fileName + extName;
 
            string imageFilter = ".jpg|.png|.gif|.ico";// 隨便模擬幾個圖片類型
            if (imageFilter.Contains(extName.ToLower()))
            {
                string phyFilePath = server.MapPath("~/Upload/Image/") + fullName;
                files[i].SaveAs(phyFilePath);
                response.Write("上傳成功!文件名:" + fullName + "<br />");
                response.Write(string.Format("<img src='Upload/Image/{0}'/><br />", fullName));
            }
        }
    }
}

 

 

如何判斷上傳文件類型是指定類型?

       怎麼肯定上傳文件的類型是指定類型,而不是僅僅修改了後綴名的欺騙文件?網站

       對於一些精確控制的需求,能夠經過讀取文件頭的字節來肯定文件的真實類型。這些文件頭的類型就很是之多了,下面僅記錄一些較爲經常使用的類型(網上可搜索):ui

FFD8FFFE00, .JPEG;.JPE;.JPG, "JPG Graphic File"spa

FFD8FFE000, .JPEG;.JPE;.JPG, "JPG Graphic File"code

474946383961, .gif, "GIF 89A"

474946383761, .gif, "GIF 87A"

424D, .bmp, "Windows Bitmap"

4D5A, .exe;.com;.386;.ax;.acm;.sys;.dll;.drv;.flt;.fon;.ocx;.scr;.lrc;.vxd;.cpl;.x32, "Executable File"

504B0304, .zip, "Zip Compressed"

3A42617365, .cnt, ""

D0CF11E0A1B11AE1, .doc;.xls;.xlt;.ppt;.apr, "MS Compound Document v1 or Lotus Approach APR file"

0100000058000000, .emf, ""

03000000C466C456, .evt, ""

3F5F0300, .gid;.hlp;.lhp, "Windows Help File"

1F8B08, .gz, "GZ Compressed File"

28546869732066696C65, .hqx, ""

0000010000, .ico, "Icon File"

4C000000011402, .lnk, "Windows Link File"

25504446, .pdf, "Adobe PDF File"

5245474544495434, .reg, ""

7B5C727466, .rtf, "Rich Text Format File"

lh, .lzh, "Lz compression file"

MThd, .mid, ""

0A050108, .pcx, ""

25215053, .eps, "Adobe EPS File"

2112, .ain, "AIN Archive File"

1A02, .arc, "ARC/PKPAK Compressed 1"

1A03, .arc, "ARC/PKPAK Compressed 2"

1A04, .arc, "ARC/PKPAK Compressed 3"

1A08, .arc, "ARC/PKPAK Compressed 4"

1A09, .arc, "ARC/PKPAK Compressed 5"

60EA, .arj, "ARJ Compressed"

41564920, .avi, "Audio Video Interleave (AVI)"

425A68, .bz;.bz2, "Bzip Archive"

49536328, .cab, "Cabinet File"

4C01, .obj, "Compiled Object Module"

303730373037, .tar;.cpio, "CPIO Archive File"

4352555348, .cru;.crush, "CRUSH Archive File"

3ADE68B1, .dcx, "DCX Graphic File"

1F8B, .gz;.tar;.tgz, "Gzip Archive File"

91334846, .hap, "HAP Archive File"

3C68746D6C3E, .htm;.html, "HyperText Markup Language 1"

3C48544D4C3E, .htm;.html, "HyperText Markup Language 2"

3C21444F4354, .htm;.html, "HyperText Markup Language 3"

100, .ico, "ICON File"

5F27A889, .jar, "JAR Archive File"

2D6C68352D, .lha, "LHA Compressed"

20006040600, .wk1;.wks, "Lotus 123 v1 Worksheet"

00001A0007800100, .fm3, "Lotus 123 v3 FMT file"

00001A0000100400, .wk3, "Lotus 123 v3 Worksheet"

20006800200, .fmt, "Lotus 123 v4 FMT file"

00001A0002100400, .wk4, "Lotus 123 v5"

5B7665725D, .ami, "Lotus Ami Pro"

300000041505052, .adx, "Lotus Approach ADX file"

1A0000030000, .nsf;.ntf, "Lotus Notes Database/Template"

4D47582069747064, .ds4, "Micrografix Designer 4"

4D534346, .cab, "Microsoft CAB File Format"

4D546864, .mid, "Midi Audio File"

000001B3, .mpg;.mpeg, "MPEG Movie"

0902060000001000B9045C00, .xls, "MS Excel v2"

0904060000001000F6055C00, .xls, "MS Excel v4"

7FFE340A, .doc, "MS Word"

1234567890FF, .doc, "MS Word 6.0"

31BE000000AB0000, .doc, "MS Word for DOS 6.0"

1A00000300001100, .nsf, "Notes Database"

7E424B00, .psp, "PaintShop Pro Image File"

504B0304, .zip, "PKZIP Compressed"

89504E470D0A, .png, "PNG Image File"

6D646174, .mov, "QuickTime Movie"

6D646174, .qt, "Quicktime Movie File"

52617221, .rar, "RAR Archive File"

2E7261FD, .ra;.ram, "Real Audio File"

EDABEEDB, .rpm, "RPM Archive File"

2E736E64, .au, "SoundMachine Audio File"

53495421, .sit, "Stuffit v1 Archive File"

53747566664974, .sit, "Stuffit v5 Archive File"

1F9D, .z, "TAR Compressed Archive File"

49492A, .tif;.tiff, "TIFF (Intel)"

4D4D2A, .tif;.tiff, "TIFF (Motorola)"

554641, .ufa, "UFA Archive File"

57415645666D74, .wav, "Wave Files"

D7CDC69A, .wmf, "Windows Meta File"

4C000000, .lnk, "Windows Shortcut (Link File)"

504B3030504B0304, .zip, "WINZIP Compressed"

FF575047, .wpg, "WordPerfect Graphics"

FF575043, .wp, "WordPerfect v5 or v6"

3C3F786D6C, .xml, "XML Document"

FFFE3C0052004F004F0054005300540055004200, .xml, "XML Document (ROOTSTUB)"

3C21454E54495459, .dtd, "XML DTD"

 

       另外,還能夠經過 HttpPostedFile 對象的 ContentType 屬性來獲得文件的 MIME 內容類型

 

 

如何上傳超大文件?

       ASP.NET 默認的請求長度爲 4096,若是頭信息中 Content-Length 的請求長度超過默認的值, IIS 將返回一個 403 錯誤信息。顯然,你會直接聯想到如下 2 種解決方案:

  1. 修改 web.config 的配置,擴大此 Web 項目請求長度的限制:
<system.web>
    <httpRuntime maxRequestLength="40960" executionTimeout="3600" />
</system.web>

   2. 修改 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\machine.config 中的對應節,如上(全部 Web 項目都突破了默認限制)。

 

      在 IIS 7.0 以後,最大上傳文件的尺寸好像是 2GB。

相關文章
相關標籤/搜索