質問: "C:/test.pdf";」 と変更してみても、同様にダウンロードは「ファイルがありません」との結果になりました。 指定先パスのファイルの入れ忘れは確認しました。
回答: URL パス(例: http://localhost/UploadFile/test.pdf)と物理パス(例: C:\UploadFile\test.pdf)の使い分けが理解できていなかったようですね。 html の a 要素の href 属性に設定するのは URL パス、C# のコードで FilePathResult メソッドの第 1 引数に設定するのは物理パスになります。 Url.Content メソッドは、Web アプリケーションのルート演算子 (~) を使ってアプルケーションルートからの URL パスを取得するもの、Server.MapPath メソッドは URL パスから物理パスを取得するためのものと覚えておけばいいと思います。 なので、今回のケースでは a 要素の href 属性の設定は、 ``` ``` とします。これが ASP.NET によって html コードにレンダリングされると、 ``` ``` となります。 URL パスの設定、ルート演算子 (~) を使うことのメリットは以下の記事を読んでください。 ASP.NET Web サイトのパス なお、ダウンロードするのに上記のように a 要素で直リンクするのは、セキュリティの面とかキャッシュコントロールの面であまりお勧めではありません。 質問者さんがトライしたように、ASP.NET MVC に備わった FilePathResult を利用した方がよさそうです。 こちらは物理パスが必要ですので、Server.MapPath メソッドを使って以下のようにします。 ``` public ActionResult FileDownload() { string fileName = Server.MapPath("~/UploadFile/test.pdf"); return File(fileName, "application/pdf", "test.pdf"); } ``` ブラウザから上のアクションメソッド FileDownload 直接呼び出すか、a 要素の href 属性に上記アクションメソッドへの URL パスを設定してクリックすればダウンロードされます。 上のコードの return File(...); のヘルパーメソッド File は、FileResult クラスを継承した FilePathResult, FileContentResult, FileStreamResult 派生メソッドのいずれかを呼び出します。それらの使い分けは以下の通りです。 FilePathResult: コンテンツが既存のファイルとして提供される。 FileStreamResult: コンテンツがストリームとして提供される。 FileContentResult: コンテンツがバイト配列として提供される。 上記のどれを呼び出すかは return File(...); の引数によります。上のコード例では第 1 引数が文字列(物理パスを表す)なので FilePathResult が呼び出されます。 第 2, 3 引数で応答ヘッダに Content-Type と Content-Disposition を適切に設定します。