今天,我的同事、同學、朋友老曲過生日,玩的有點晚了,以后在和朋友一起出去玩,盡量多吃飯少喝酒。前段時間,碰到一個如何進行用流文件的形式輸出文件的問題,沒有找到好方法。我的同事、同學、朋友小朝,給我提供了很不錯的建議,使用一般處理程序處理文件以文件流的形式輸出,並將其指向對應的地址(URL或Src)。簡單的測試程序:
1.VS2010建立一個空白 Web項目,新建一個ASPX頁面(WebPlayer.aspx)輸入如下代碼:
(該文件包含一個圖片顯示標簽、Windows Media Player播放器插件、BS Contact Control插件調用)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebPlayer.aspx.cs" Inherits="PPTWebTest.WebPlayer" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div style="height: 300px; width: 300px; float: left"> <img src="WebPlayerDecoding.ashx?type=picture" alt="pp" /> </div> <div style="height: 300px; width: 300px; float: left; margin-left:10px"> <object id="player" height="100%" width="100%" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"> <param name="AutoStart" value="-1"> <!--是否自動播放--> <param name="Balance" value="0"> <!--調整左右聲道平衡,同上面舊播放器代碼--> <param name="enabled" value="-1"> <!--播放器是否可人為控制--> <param name="EnableContextMenu" value="-1"> <!--是否啟用上下文菜單--> <param name="url" value="WebPlayerDecoding.ashx?type=media"> <!--<param name="Filename" value="/blog/01.wma" valuetype="ref">--> <!--播放的文件地址--> <param name="PlayCount" value="1"> <!--播放次數控制,為整數--> <param name="rate" value="1"> <!--播放速率控制,1為正常,允許小數,1.0-2.0--> <param name="currentPosition" value="0"> <!--控件設置:當前位置--> <param name="currentMarker" value="0"> <!--控件設置:當前標記--> <param name="defaultFrame" value=""> <!--顯示默認框架--> <param name="invokeURLs" value="0"> <!--腳本命令設置:是否調用URL--> <param name="baseURL" value=""> <!--腳本命令設置:被調用的URL--> <param name="stretchToFit" value="0"> <!--是否按比例伸展--> <param name="volume" value="50"> <!--默認聲音大小0%-100%,50則為50%--> <param name="mute" value="0"> <!--是否靜音--> <param name="uiMode" value="mini"> <!--播放器顯示模式:Full顯示全部;mini最簡化;None不顯示播放控制,只顯示視頻窗口;invisible全部不顯示--> <param name="windowlessVideo" value="0"> <!--如果是0可以允許全屏,否則只能在窗口中查看--> <param name="fullScreen" value="0"> <!--開始播放是否自動全屏--> <param name="enableErrorDialogs" value="-1"> <!--是否啟用錯誤提示報告--> <param name="SAMIStyle" value> <!--SAMI樣式--> <param name="SAMILang" value> <!--SAMI語言--> <param name="SAMIFilename" value> <!--字幕ID--> </object> </div> <div style="height: 300px; width: 300px; float: left; margin-left: 10px"> <object classid="CLSID:4B6E3013-6E45-11D0-9309-0020AFE05CC8" id="bsContact" width="100%" height="100%"> <param name="SRC" value="WebPlayerDecoding.ashx?type=3DMax"> </object> </div> </form> </body> </html>
2.其請求的一般處理程序(WebPlayerDecoding.ashx)實現文件流的形式輸出:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; namespace PPTWebTest { /// <summary> /// WebPlayerDecoding 的摘要說明 /// </summary> public class WebPlayerDecoding : IHttpHandler { public void ProcessRequest(HttpContext context) { string type = context.Request["type"].ToString(); MemoryStream ms = null; string fileName = string.Empty; switch (type) { case "picture": fileName = @"E:\Pictures\images.jpg"; context.Response.ContentType = "image/jpeg"; break; case "media": fileName = @"E\教程1(上).avi"; context.Response.ContentType = "video/x-msvideo"; break; case "3DMax": fileName = @"E:\BS Contact\avatar.wrl"; context.Response.ContentType = "x-world/x-vrml"; break; } //簡單流文件讀取(或復雜業務操作) FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); ms = new MemoryStream(); Byte[] bytes = new Byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); ms.Write(bytes, 0, bytes.Length); ms.WriteTo(context.Response.OutputStream); ms.Close(); fs.Close();//也可以使用using進行文件流處理,注意流的關閉、釋放
context.Response.End(); } public bool IsReusable { get { return false; } } } }
將本地的文件以文件流的形式讀取,存入內存流然后在輸出,可以很好的實現一些很特別的業務需求,以前沒有很特別的使用這種方法,不過發現真的很不錯。你可能會說直接在WebPlayer.aspx頁面,直接指定標簽或插件的URL或SRC不是很好嗎,但對於一些特殊的業務需求可能不能很好的滿足。
可以在一般處理程序中指定文件的輸出格式,並需要在其調用的前台頁面有對應的標簽或插件來接受這種格式的文件流,后台通過文件流的形式輸出,前台有對應的展示該文件格式的標簽或插件,前后保持一致就可。BS Contact插件支持的文件格式常用的圖片、音頻、視頻、3D模型文件等等比較多,感興趣的朋友可以測試一些。
像導出Excel的操作《[轉]DataSet導出Excel,比以往的方法導出的Excel外觀更加好看》也是很不錯的。
通過文件流形式輸出文件的方式實現文件的展示,也同樣支持其他常用格式文件的輸出,如Flash文件、3D模型文件、PDF文件、Excel文件等等,常用有如下格式:
按照內容類型排列的 Mime 類型列表:參見《MIME 類型(HttpContext.Response.ContentType)列表[轉]》
按照內容類型排列的 Mime 類型列表:
| 類型/子類型 | 擴展名 |
|---|---|
| application/envoy | evy |
| application/fractals | fif |
| application/futuresplash | spl |
| application/hta | hta |
| application/internet-property-stream | acx |
| application/mac-binhex40 | hqx |
| application/msword | doc |
| application/msword | dot |
| application/octet-stream | * |
| application/octet-stream | bin |
| application/octet-stream | class |
| application/octet-stream | dms |
| application/octet-stream | exe |
| application/octet-stream | lha |
| application/octet-stream | lzh |
| application/oda | oda |
| application/olescript | axs |
| application/pdf | |
| application/pics-rules | prf |
| application/pkcs10 | p10 |
| application/pkix-crl | crl |
| application/postscript | ai |
| application/postscript | eps |
| application/postscript | ps |
| application/rtf | rtf |
| application/set-payment-initiation | setpay |
| application/set-registration-initiation | setreg |
| application/vnd.ms-excel | xla |
| application/vnd.ms-excel | xlc |
| application/vnd.ms-excel | xlm |
| application/vnd.ms-excel | xls |
| application/vnd.ms-excel | xlt |
| application/vnd.ms-excel | xlw |
| application/vnd.ms-outlook | msg |
| application/vnd.ms-pkicertstore | sst |
| application/vnd.ms-pkiseccat | cat |
| application/vnd.ms-pkistl | stl |
| application/vnd.ms-powerpoint | pot |
| application/vnd.ms-powerpoint | pps |
| application/vnd.ms-powerpoint | ppt |
| application/vnd.ms-project | mpp |
| application/vnd.ms-works | wcm |
| application/vnd.ms-works | wdb |
| application/vnd.ms-works | wks |
| application/vnd.ms-works | wps |
| application/winhlp | hlp |
| application/x-bcpio | bcpio |
| application/x-cdf | cdf |
| application/x-compress | z |
| application/x-compressed | tgz |
| application/x-cpio | cpio |
| application/x-csh | csh |
| application/x-director | dcr |
| application/x-director | dir |
| application/x-director | dxr |
| application/x-dvi | dvi |
| application/x-gtar | gtar |
| application/x-gzip | gz |
| application/x-hdf | hdf |
| application/x-internet-signup | ins |
| application/x-internet-signup | isp |
| application/x-iphone | iii |
| application/x-javascript | js |
| application/x-latex | latex |
| application/x-msaccess | mdb |
| application/x-mscardfile | crd |
| application/x-msclip | clp |
| application/x-msdownload | dll |
| application/x-msmediaview | m13 |
| application/x-msmediaview | m14 |
| application/x-msmediaview | mvb |
| application/x-msmetafile | wmf |
| application/x-msmoney | mny |
| application/x-mspublisher | pub |
| application/x-msschedule | scd |
| application/x-msterminal | trm |
| application/x-mswrite | wri |
| application/x-netcdf | cdf |
| application/x-netcdf | nc |
| application/x-perfmon | pma |
| application/x-perfmon | pmc |
| application/x-perfmon | pml |
| application/x-perfmon | pmr |
| application/x-perfmon | pmw |
| application/x-pkcs12 | p12 |
| application/x-pkcs12 | pfx |
| application/x-pkcs7-certificates | p7b |
| application/x-pkcs7-certificates | spc |
| application/x-pkcs7-certreqresp | p7r |
| application/x-pkcs7-mime | p7c |
| application/x-pkcs7-mime | p7m |
| application/x-pkcs7-signature | p7s |
| application/x-sh | sh |
| application/x-shar | shar |
| application/x-shockwave-flash | swf |
| application/x-stuffit | sit |
| application/x-sv4cpio | sv4cpio |
| application/x-sv4crc | sv4crc |
| application/x-tar | tar |
| application/x-tcl | tcl |
| application/x-tex | tex |
| application/x-texinfo | texi |
| application/x-texinfo | texinfo |
| application/x-troff | roff |
| application/x-troff | t |
| application/x-troff | tr |
| application/x-troff-man | man |
| application/x-troff-me | me |
| application/x-troff-ms | ms |
| application/x-ustar | ustar |
| application/x-wais-source | src |
| application/x-x509-ca-cert | cer |
| application/x-x509-ca-cert | crt |
| application/x-x509-ca-cert | der |
| application/ynd.ms-pkipko | pko |
| application/zip | zip |
| audio/basic | au |
| audio/basic | snd |
| audio/mid | mid |
| audio/mid | rmi |
| audio/mpeg | mp3 |
| audio/x-aiff | aif |
| audio/x-aiff | aifc |
| audio/x-aiff | aiff |
| audio/x-mpegurl | m3u |
| audio/x-pn-realaudio | ra |
| audio/x-pn-realaudio | ram |
| audio/x-wav | wav |
| image/bmp | bmp |
| image/cis-cod | cod |
| image/gif | gif |
| image/ief | ief |
| image/jpeg | jpe |
| image/jpeg | jpeg |
| image/jpeg | jpg |
| image/pipeg | jfif |
| image/svg+xml | svg |
| image/tiff | tif |
| image/tiff | tiff |
| image/x-cmu-raster | ras |
| image/x-cmx | cmx |
| image/x-icon | ico |
| image/x-portable-anymap | pnm |
| image/x-portable-bitmap | pbm |
| image/x-portable-graymap | pgm |
| image/x-portable-pixmap | ppm |
| image/x-rgb | rgb |
| image/x-xbitmap | xbm |
| image/x-xpixmap | xpm |
| image/x-xwindowdump | xwd |
| message/rfc822 | mht |
| message/rfc822 | mhtml |
| message/rfc822 | nws |
| text/css | css |
| text/h323 | 323 |
| text/html | htm |
| text/html | html |
| text/html | stm |
| text/iuls | uls |
| text/plain | bas |
| text/plain | c |
| text/plain | h |
| text/plain | txt |
| text/richtext | rtx |
| text/scriptlet | sct |
| text/tab-separated-values | tsv |
| text/webviewhtml | htt |
| text/x-component | htc |
| text/x-setext | etx |
| text/x-vcard | vcf |
| video/mpeg | mp2 |
| video/mpeg | mpa |
| video/mpeg | mpe |
| video/mpeg | mpeg |
| video/mpeg | mpg |
| video/mpeg | mpv2 |
| video/quicktime | mov |
| video/quicktime | qt |
| video/x-la-asf | lsf |
| video/x-la-asf | lsx |
| video/x-ms-asf | asf |
| video/x-ms-asf | asr |
| video/x-ms-asf | asx |
| video/x-msvideo | avi |
| video/x-sgi-movie | movie |
| x-world/x-vrml | flr |
| x-world/x-vrml | vrml |
| x-world/x-vrml | wrl |
| x-world/x-vrml | wrz |
| x-world/x-vrml | xaf |
| x-world/x-vrml | xof |
當然,上面的代碼還可以優化。根據這個表做一個文件類型與輸出類型的對照字典集合,給一個文件路徑,字符串截取取得其擴展名,然后根據其擴展名查找對應的輸出類型。這樣就根據文件自動查找輸出的文件類型格式了,少些很多代碼。
