2010-08-13 57 views
0

我有一個MHTML文件,其中嵌入圖像。 MHTML是在服務器上生成的,然後我通常會使用BinaryWrite來交付文件。在轉換爲ASCII並將文件寫入磁盤並使用Response.WriteFile之後,我也嘗試了Server.Transfer,Response.Write。在任何這些情況下,結果文件不會(看起來)被視爲mht文件。爲了設置圖像,我嘗試了Content-ID和Content-Location。在IE8中查看時,圖像URL顯示爲cid:example1。保存到磁盤後打開文件時,它顯示爲mhtml:file://C:\DocumentsSettings\benjynito\Desktop\output634172401776447258.mht!cid:example1。或者在使用其中一種方法進行瀏覽時,您會得到mhttp://...output123.mht!cid:example1MHT文件BinaryWrite不被視爲MHT通過IE

Output.MimeType是message/rfc822。我也試過應用程序/八位字節流和多部分/相關。

將文件寫入磁盤並使用Response.Redirect工作。使用直接URL訪問文件的作品。將文件保存到磁盤然後打開文件。

看來IE假定HTML請求的結果並沒有破譯新的內容類型。但是你可以爲動態樣式表,腳本等做這樣的事情......所以我不太相信這一點。我看不到任何明顯的差異。我剛剛嘗試過,BinaryWrite在Opera中運行良好。

如果我絕對要擔心寫入臨時目錄然後重定向到文件,我會。我只是希望避免必須清理臨時文件。我想不可能做什麼?下面是一個寫文件的例子。

在此先感謝!

if (response != null && response.Output != null) 
{ 
    Response.Clear(); 
    Response.AddHeader("Content-Type", response.Output.MimeType); 
    Response.AddHeader("Content-Disposition", "attachment;filename=output" + DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture) + "." + response.Output.Extension); 

    // Response.Write(System.Text.Encoding.ASCII.GetString(response.Output.Bytes)); 
    Response.BinaryWrite(response.Output.Bytes); 

    //Response.Clear(); 
    //Server.Transfer("/ISV/Forms/Test/output634172397522707394.mht"); 

    //Response.Clear(); 
    //Response.WriteFile(Server.MapPath("/ISV/Forms/Test/output634172397522707394.mht")); 

    Response.Flush(); 
    Response.End(); 
} 

回答

1

我不認爲您的Content-Type和Content-Disposition標頭是正確的。當您將MHTML作爲靜態文件下載時,請使用Fiddler查看它們設置的內容。

嘗試一種類型的multipart/related和inline的處置。有這個組合工作的some evidence

+0

我會試試看。我注意到內容長度沒有顯示在標題下,但是我的二進制編寫的文件使用g-zip編碼,因此我要嘗試手動設置該標題。否則,標題排隊很好,我已經嘗試匹配標題了。感謝您的迴應。 – 2010-08-13 13:40:31

+0

嗯,還沒有完全弄清楚,但我懷疑它與我的MHT文件格式的東西。我已經能夠採取一個IE生成的MHT文件,並對它做一個BinaryWrite,它的工作原理。 – 2010-08-13 15:19:25

+0

好吧,這將解釋它。 – 2010-08-13 18:17:29