Asp.net mvc Core 2.0 MVC-如何链接到保存在文件系统上的动态PDF

Asp.net mvc Core 2.0 MVC-如何链接到保存在文件系统上的动态PDF,asp.net-mvc,asp.net-mvc-4,pdf,asp.net-core,Asp.net Mvc,Asp.net Mvc 4,Pdf,Asp.net Core,我有一个.NETCore2.0MVC项目。我的一个模型有一个名为PDFUpload的NotMapped IFormFile字段,它进行上传并将文件保存到文件系统根目录之外的位置,该路径保存在PDF字段中。当用户点击特定URL时,需要在浏览器中显示或下载PDF。My Details.cshtml视图当前仅显示路径 @Html.DisplayFor(model => model.PDF) 如何将其转换为实际链接,从特定URL提供文件服务,而不显示路径 更新:这是工作版本 if (Syste

我有一个.NETCore2.0MVC项目。我的一个模型有一个名为PDFUpload的NotMapped IFormFile字段,它进行上传并将文件保存到文件系统根目录之外的位置,该路径保存在PDF字段中。当用户点击特定URL时,需要在浏览器中显示或下载PDF。My Details.cshtml视图当前仅显示路径

 @Html.DisplayFor(model => model.PDF)
如何将其转换为实际链接,从特定URL提供文件服务,而不显示路径

更新:这是工作版本

if (System.IO.File.Exists(pdf))
{
    var stream = new FileStream(pdf, FileMode.Open);
    // send the file to the browser
    stream.Position = 0;
    //return File(stream,"application/pdf","filename.pdf") //- will force download
    return new FileStreamResult(stream, "application/pdf");//will display in browser        
}

您可以只做一个控制器操作来提供文件。您将需要某种方法来标识文件并使用该标识符来定位它。类似这样(我用了一个鼻涕虫):

那么在你看来,

//generate the link, could also do this with tag helpers
@Html.ActionLink("download the pdf", "GimmeThePdf", "YourController", new {slug = Model.PdfSlug});
这将产生如下结果:

<a href="http://yoursite.com/YourController/GimmeThePdf?slug=...">download the pdf</a>

我只是想添加到@Becuzz Answer中。我在处理我的文件时遇到了问题,我在这里找到了答案


在控制器中,不要使用返回视图,而是使用用户
返回文件(model.PDF,“application/PDF”)
在浏览器中显示PDF或
返回文件(model.PDF,“application/PDF”,“your File name.PDF”)强制下载Mylie非常感谢你的提示!谢谢@Becuzz,这帮了大忙。我无法使用(Stream Stream=new FileStream(filepathtodf,FileMode.Open)使其工作,并出现错误ObjectDisposedException:无法访问关闭的文件。文件(Stream)。我删除了“使用”它工作了,但我担心流在返回后没有被正确关闭。我应该吗?@user6383418我以前遇到过这个问题。通常只是通过使用MemoryStream读取所有字节并将其传递到File方法来解决它。至于流是否被处理,没有。所以现在你正在等待垃圾collsection/process reset/etc以释放对文件的保留。我不太熟悉在保留文件时会发生什么的细节,但最好确保正确处理流。
<a href="http://yoursite.com/YourController/GimmeThePdf?slug=...">download the pdf</a>
public IActionResult GimmeThePdf(string slug)
{
    string filePathToPdf = // look this up in a database given the slug, map the path, etc.

    // open the file for reading
    FileStream stream = new FileStream(filePathToPdf, FileMode.Open);

    // Register this stream for disposal after response is finished.
    HttpContext.Response.RegisterForDispose(stream);

    // send the file to the browser
    //return File(stream,"application/pdf","filename.pdf") //- will force download
    return File(stream, "application/pdf");
}