私は、ASP.Net で構築された、継承したサイトで作業していますが、これには少し慣れています。ページの 1 つは、ドキュメント (word または pdf) へのリンクを許可し、クリックすると、ユーザーにファイルを保存するか開くように促しますが、ファイルの実際のパスは明らかにしません。このようにして、ユーザーが URL をファイルに貼り付けるのを防ぎます。リンクは、有効なセッションをチェックしてからファイルを取得する aspx ファイルへのリンクです。
とにかく、多くのレガシー コードがあるため、静的な htm ファイルの束でもこれを行う必要がありますが、これらのファイルは、ユーザーに保存するように求めるのではなく、表示する必要があります。コンテンツ タイプを application/text、application/html、text/html などに変更しようとしましたが、うまくいかず、content-disposition インラインの応答ヘッダーを追加してみました。それを行ってビルドし、ファイルにリンクしようとすると、いくつかの実行時例外が発生します。
[FormatException: Input string was not in a correct format.]
Microsoft.VisualBasic.CompilerServices.Conversions.ParseDecimal(String Value, NumberFormatInfo NumberFormat) +206
Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(String Value) +110
[InvalidCastException: Conversion from string "inline; filename=\" + myFile + " to type 'Long' is not valid.]
Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(String Value) +428
cmswebasp.CMSModdoclinks.DownloadFile(String file) +1704
cmswebasp.CMSModdoclinks.Page_Load(Object sender, EventArgs e) +625
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627
ページのコード スニペットを次に示します。
Response.AddHeader("Content-Disposition", "inline; filename=" & file)
Dim fi As New FileInfo(myFile)
Response.AddHeader("Content-Length", fi.Length)
Dim contentType As String = ""
Dim fileExt As String = file.Split(".")(1)
Select Case fileExt
Case "htm"
contentType = "application/text"
Case Else
contentType = "application/octet-stream"
End Select
Response.ContentType = contentType
Response.WriteFile(myFile)
htmlwriter オブジェクトなどで何かをする必要がありますか? ファイルが表示された状態で新しいブラウザ ウィンドウを開くことはできませんか、それともこの方法で使用する場合はユーザーにプロンプトを表示する必要がありますか??