Как вернуть ссылку на файл в ASP Net Core? - PullRequest
1 голос
/ 19 февраля 2020

Я не знаю, как обслуживать ссылки на файлы в ASP Net Core. Я пытался использовать класс PhyisicalFileProvider, но безрезультатно.

Что я хочу

Учитывая папку root на жестком диске, при получении строки запроса типа: /localFolder/test.txt я хочу, чтобы сервер отправил Link, чтобы пользователь мог щелкнуть и получить файл test.txt

Важно
Я не хочу отправить файл , но ссылку на он может щелкнуть по нему и загрузить.

Что я пробовал :

1.Использовать метод расширения IApplicationBuilder.Map, чтобы направлять запросы напрямую к файлу.

2. Используя метод расширения IApplicationBuilder.Map + Добавление промежуточного программного обеспечения, хотя я не знаю, как мне обслуживать ссылку? (добавить его в теле ответа?)

Запуск

public void ConfigureServices(IServiceCollection collection)
{
      //i have also added the provider to the service collection to further inject it in the middleware 
       var phyisicalFileProvider = new PhysicalFileProvider(config.Storage.DocxFileRoot);
       services.AddSingleton<IFileProvider>(phyisicalFileProvider);
}
public void Configure()
{
  //scenario without middleware
   app.Map("/localfiles", x => 
         x.UseStaticFiles(new StaticFileOptions {
            FileProvider = new PhysicalFileProvider([some file root]),RequestPath ="/localfiles"}
           ));
   //scenario with middleware 
   app.Map("/localfiles",x=>
               x.UseMiddleware<FileWare>()
          );


   app.UseEndpoints(endpoints => {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=File}/{action=Index}/{id?}");
   });

}

Промежуточное ПО

public class FileWare
{
      private IFileProvider provider;
      private RequestDelegate next;

      public FileWare(RequestDelegate next,IFileProvider provider)
      { 
           this.provider=provider;
           this.next=next;
      }

      public async Task Invoke(HttpContext context)
      {
            var query = context.Request.Query;
            var path=query.First(x => x.Key == "path").Value;
            var fileInfo=this.provider.GetFileInfo(path);
            await fileInfo.CreateReadStream().CopyToAsync(context.Response.Body);
       }
}

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы просто хотите иметь ссылку в виде бритвы, щелкните ссылку, чтобы загрузить файл на локальный диск (например, C:\MyFolder), вы можете выполнить следующие шаги:

1. Просмотр бритвы

<a asp-controller="File" asp-action="download" asp-route-path="C:\MyFolder\test.txt">Download</a>

2.FileController

public IActionResult Download([FromQuery]string path)
    {

        string fileName = "test.txt";

        byte[] fileBytes = System.IO.File.ReadAllBytes(path);

        return File(fileBytes, "application/force-download", fileName);
    }
...