コントローラアクションからストレートHTMLファイルを提供したいという特殊なケースがあります。
ビューフォルダ以外の別のフォルダから提供したい。ファイルはにあります
Solution\Html\index.htm
そして、私はそれを標準のコントローラーアクションから提供したいと思います。リターンファイルを使用できますか?そして、どうすればこれを行うことができますか?
コントローラアクションからストレートHTMLファイルを提供したいという特殊なケースがあります。
ビューフォルダ以外の別のフォルダから提供したい。ファイルはにあります
Solution\Html\index.htm
そして、私はそれを標準のコントローラーアクションから提供したいと思います。リターンファイルを使用できますか?そして、どうすればこれを行うことができますか?
この index.htm ファイルをブラウザーでレンダリングする場合は、次のようなコントローラー アクションを作成できます。
public void GetHtml()
{
var encoding = new System.Text.UTF8Encoding();
var htm = System.IO.File.ReadAllText(Server.MapPath("/Solution/Html/") + "index.htm", encoding);
byte[] data = encoding.GetBytes(htm);
Response.OutputStream.Write(data, 0, data.Length);
Response.OutputStream.Flush();
}
または単に:
public ActionResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html");
}
したがって、このアクションがHomeコントローラーにあり、一部のユーザーがhttp://yoursite.com/Home/GetHtmlをヒットすると、index.htm がレンダリングされるとしましょう。
編集:他の2つの方法
ブラウザでindex.htmの生の html を表示したい場合:
public ActionResult GetHtml()
{
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition { Inline = true, FileName = "index.htm"}.ToString());
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/plain");
}
ファイルをダウンロードするだけの場合:
public FilePathResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html", "index.htm");
}
html ファイルを文字列で読み取り、それをアクションで返すことができますか? 以下に示すように、Html ページとしてレンダリングされます。
public string GetHtmlFile(string file)
{
file = Server.MapPath("~/" + file);
StreamReader streamReader = new StreamReader(file);
string text = streamReader.ReadToEnd();
streamReader.Close();
return text;
}
Home/GetHtmlFile?file=ソリューション\Html\index.htm
HTML ファイルの宛先または保存メカニズムが複雑な場合は、仮想パス プロバイダーを使用できます。
.net コアを使用する場合の代替アプローチは、FileProvider を使用することです。ファイルは、フォルダー内にあるか、コンパイル時に埋め込まれている可能性があります。
この例では、埋め込みファイルを使用します。
プロジェクトにフォルダーを追加します。アセットとしましょう。その中にファイル myfile.html を作成し、いくつかの基本的な html をファイルに追加します。
<html>
<head>
<title>Test</title>
</head>
<body>
Hello World
</body>
</html>
新しいファイルを右クリックして (Visual Studio を使用していると仮定)、プロパティを選択し、プロパティ画面/ビルド アクションで、埋め込みリソースを選択します。csproj ファイルにファイルが追加されます。
プロジェクトを右クリックし、csproj ファイルを編集します。プロパティ グループに以下が含まれていることを確認します。
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
そうでない場合は、追加してください。csproj には、新しく作成された html ファイルも次のように含まれている必要があります。
<ItemGroup>
<EmbeddedResource Include="assets\myfile.html" />
</ItemGroup>
コントローラーでファイルを読み取ってクライアントに渡すには、startup.cs に追加されたファイル プロバイダーが必要です。
startup.cs を編集して、HostingEnvironment が含まれていることを確認します。
private readonly IHostingEnvironment HostingEnvironment;
public Startup(IHostingEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
}
次に、ファイル プロバイダーを作成し、実行時に挿入できるサービスにします。次のように作成します。
var physicalProvider = HostingEnvironment.ContentRootFileProvider;
var manifestEmbeddedProvider =
new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
var compositeProvider =
new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);
services.AddSingleton<IFileProvider>(compositeProvider);
ファイルを提供するには、コントローラーに移動し、依存性注入を使用して FileProvider を取得し、新しいサービスを作成してファイルを提供します。これを行うには、プロバイダーをコンストラクターに追加して、依存関係の挿入から始めます。
IFileProvider _fileProvider;
public MyController(IFileProvider fileProvider)
{
this._fileProvider = fileProvider;
}
次に、サービスでファイル プロバイダーを使用します
[HttpGet("/myfile")]
[Produces("text/html")]
public Stream GetMyFile()
{
// Use GetFileInfo to get details on the file passing in the path added to the csproj
// Using the fileInfo returned create a stream and return it.
IFileInfo fileinfo = _fileProvider.GetFileInfo("assets/myfile.html");
return fileinfo.CreateReadStream();
}
詳細については、ASP .Net Core ファイル プロバイダーのサンプルと Microsoft のドキュメントを参照してください。