Я не знаю, как обслуживать ссылки на файлы в 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);
}
}