1、ファイルのMIMEタイプへのアクセス:FileExtensionContentTypeProvider
参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1
IFileProvider:2は、.NETコアプログラムからファイルを取得します
参考:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/file-providers?view=aspnetcore-3.1
PhysicalFile:3、結果はファイルのアクションメソッドから返されます
参考:https://stackoverflow.com/questions/53631178/invalidoperationexception-on-file-return
4、正しく扱うファイルのダウンロードHTTPヘッダ:PhysicalFile結果は自動的に処理されたASP.NET
参考:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/
https://www.cnblogs.com/brucejia/archive/2012/12/24/2831060.html
テストコード:
[ApiController] [ルート(" [コントローラー] " )] パブリック クラスDownloadController:コントローラ { 公共DownloadController(IHostEnvironment環境、IFileProvider fileProvider) { ホスト環境 = 環境。 プロバイダファイル = ファイルプロバイダ; } IHostEnvironmentホスト環境。 IFileProviderファイルプロバイダ; [HTTPGET] [ルート(" インデックス" )] パブリック IActionResultインデックス(文字列のファイル名) { VARパス= @ " \ TEMP \ " + ファイル名。 // チェックファイルが存在 VARをのfileInfo = FileProvider.GetFileInfo(パス); IF(fileInfo.PhysicalPath == NULL ) { リターンのコンテンツが(" ファイルが存在しない(" + HostEnvironment.ContentRootPath + " ):" + ファイル名); } // ファイルの種類のチェック FileExtensionContentTypeProviderプロバイダを= 新しい新しいFileExtensionContentTypeProvider(); IF(!Provider.TryGetContentType(パス、OUT 文字列のcontentType)) { リターン・コンテンツ(「不明なファイルの種類:」 + fileInfo.PhysicalPath)。 } // リターンがダウンロード 返すコンテンツ($ " ファイルパス:fileInfo.PhysicalPath {}、MIME :. ContentTypeを{} " ); } [HTTPGET] [ルート(" ファイル" )] 公共 IActionResultファイル(文字列のファイル名) { VARパス= @ " \ TEMP \ " + ファイル名。 // チェックファイルが存在 VARをのfileInfo = FileProvider.GetFileInfo(パス); IF(fileInfo.PhysicalPath == NULL ) { リターンのコンテンツが(" ファイルが存在しない(" + HostEnvironment.ContentRootPath + " ):" + ファイル名); } // ファイルの種類のチェック FileExtensionContentTypeProviderプロバイダを= 新しい新しいFileExtensionContentTypeProvider(); IF(!Provider.TryGetContentType(パス、OUT 文字列のcontentType)) { リターン・コンテンツ(「不明なファイルの種類:」 + ファイル名); } // 戻り、ダウンロード 戻り PhysicalFile(fileInfo.PhysicalPath、contentTypeのは、「これはの.xlsxダウンロードするファイルの名前です」); } }
Startup.cs
パブリック クラススタートアップ { 公共のスタートアップ(IConfiguration構成、IHostEnvironment環境) { 設定 = 設定。 ホスト環境 = 環境。 } 公共 IConfiguration設定{ 取得します。} 公共 IHostEnvironmentホスト環境{ 取得します。} // このメソッドはランタイムによって呼び出されます。コンテナにサービスを追加するには、このメソッドを使用します。 公共 のボイドConfigureServices(IServiceCollectionサービス) { services.AddControllers(); // ファイルプロバイダー // 参考資料:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/file-providers?view=aspnetcore-3.1 VAR physicalProvider = HostEnvironment.ContentRootFileProvider。 VAR embeddedProvider = 新しいEmbeddedFileProvider(Assembly.GetEntryAssembly()); VAR compositeProvider = 新しいCompositeFileProvider(physicalProvider、embeddedProvider)。 services.AddSingleton <IFileProvider> (compositeProvider)。 } // このメソッドはランタイムによって呼び出されます。HTTPリクエストパイプラインを設定するには、このメソッドを使用します。 公共の 無効設定(IApplicationBuilderアプリ、IWebHostEnvironment ENV) { もし(env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(エンドポイント => { endpoints.MapControllers(); }); } }