關於 wcf rest 下載手機應用

          下載的代碼html

        public Stream GetMobilePhoneApp()
        {
            strFilePath = "C://Users//XINGSQ//Pictures";
            string appFilePath = Path.Combine(strFilePath, "ICAM_DH_Android_bd_1.3.1.apk");
            FileStream appfs = new FileStream(appFilePath,FileMode.Open);
            System.Threading.Thread.Sleep(500);

            WebOperationContext.Current.OutgoingResponse.ContentType = "application/vnd.android.package-archive";        //.ipa     application/vnd.iphone
            WebOperationContext.Current.OutgoingResponse.Headers.Set("Content-Disposition","attachment;filename=ICAM_DH_Android_bd_1.3.1.apk");
            return appfs;
        }

其中最重要的是ContentType和Header的設置:android

ContentType Http協議中表示後面的文檔屬於什麼MIME類型。Servlet默認爲text/plain,但一般須要顯式地指定爲text/html。因爲常常要設置Content-Type,所以HttpServletResponse提供了一個專用的方法setContentType。c#

其中 apk(android應用)文件對應的是「application/vnd.android.package-archive」,ipa(IOS應用) 對應的是「application/vnd.iphone」瀏覽器

Content-disposition 是 MIME 協議的擴展,MIME 協議指示 MIME 用戶代理如何顯示附加的文件。Content-disposition其實能夠控制用戶請求所得的內容存爲一個文件的時候提供一個默認的文件名,文件直接 在瀏覽器上顯示或者在訪問時彈出文件下載對話框。

格式說明:
content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )  

字段說明:
Content-Disposition爲屬性名
disposition-type是以什麼方式下載,如attachment爲以附件方式下載
disposition-parm爲默認保存時的文件名
服務端向客戶端遊覽器發送文件時,若是是瀏覽器支持的文件類型,通常會默認使用瀏覽器打開,好比txt、jpg等,會直接在瀏覽器中顯示,若是須要提示用戶保存,就要利用Content-Disposition進行一下處理,關鍵在於必定要加上attachment:   
緩存

Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");

備註:這樣瀏覽器會提示保存仍是打開,即便選擇打開,也會使用相關聯的程序好比記事本打開,而不是IE直接打開了。
Content-Disposition就是當用戶想把請求所得的內容存爲一個文件的時候提供一個默認的文件名。具體的定義以下:app

content-disposition = "Content-Disposition" ":"
disposition-type *( ";" disposition-parm )
disposition-type = "attachment" | disp-extension-token
disposition-parm = filename-parm | disp-extension-parm
filename-parm = "filename" "=" quoted-string
disp-extension-token = token
disp-extension-parm = token "=" ( token | quoted-string )iphone

具體的例子以下:
Content-Disposition: attachment; filename="filename.xls"
代理

當 然filename參數能夠包含路徑信息,但User-Agnet會忽略掉這些信息,只會把路徑信息的最後一部分作爲文件名。當你在響應類型爲 application/octet- stream狀況下使用了這個頭信息的話,那就意味着你不想直接顯示內容,而是彈出一個"文件下載"的對話框,接下來就是由你來決定"打開"仍是"保存" 了。
code


注意事項:

       當代碼裏面使用Content-Disposition來確保瀏覽器彈出下載對話框的時候。 response.addHeader("Content-Disposition","attachment");必定要確保沒有作過關於禁止瀏覽器緩存的操做。以下:
htm

response.setHeader("Pragma", "No-cache"); 
response.setHeader("Cache-Control", "No-cache"); 
response.setDateHeader("Expires", 0);
相關文章
相關標籤/搜索