Sometimes you want to embed files in a browser, such as images or PDF files.
With modern browsers it is easy to just add some HTML to display a file.
<object data="documents/Hello World.pdf" type="application/pdf" width="100%" height="800px">
<p>It appears you don't have a PDF plugin for this browser.</p>
</object>
The file to be displayed needs to be in a valid location on a web server, either the webserver delivering the page or an external one accessed with a full URL.
This is fine if you do not care that it potentially exposes your file structure.
If your webserver runs a scripting language it is possible to script the delivery of the file - the file does not have to be located in a similar location to the web server files, nor does it need to be accessible by HTTP (though it can be but hidden on a SharePoint or cloud location).
The following uses ASP.NET Core to build a RESTFul interface to deliver selected files on receipt of a request.
If you have not built a Web API project before, it is worth running through the tutorial here (https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0&tabs=visual-studio).
Web API to deliver selected files
This Web API uses a RESTFul interface to request a file, the file request is included within the URL, and in this case is just an integer.
Requests to the Web API have the form:
http://<domanin name>/getpdf/<file id>
The test web page builds on the HTML above, the data attribute containing the RESTFul URL to select the files.
<object data="https://localhost:44310/getpdf/0" type="application/pdf" width="100%" height="800px">
<p>It appears you don't have a PDF plugin for this browser.</p>
</object>
GetPDFController.cs
The following code is for a controller (additional code is required, use the set up from the tutorial).
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
/// <summary>
/// Web App controller
/// Controller for RESTful access to PDFs
/// The last part of the URL is an integer that selects a specific PDF
/// https://<host>/getpdf/<pdfID>
/// </summary>
namespace GetPDF.Controllers
{
[ApiController]
[Route("[controller]")]
public class GetPDFController : ControllerBase
{
private readonly ILogger<GetPDFController> _logger;
public GetPDFController(ILogger<GetPDFController> logger)
{
_logger = logger;
}
/// <summary>
/// Returns a PDF selected by <paramref name="pdfID"/
/// THis example uses a simple switch to select the PDF,
/// in a real application this might be search parameters or
/// >multiple values that build into the file path
///
/// Additionally, in a real application there would be a
/// requirement for the authentication of the requester.
/// Additionally the PDF could be watermarked before being
/// sent.
/// </summary>
/// <param name="pdfID">PDF identifier</param>
/// <returns>PDF or 404</returns>
[HttpGet]
[Route("{pdfID:int}")]
public IActionResult Get(int pdfID)
{
string filename;
// This is for demonstration purposes only.
// This would require a more complicated solution
switch (pdfID)
{
case 0:
filename = @"C:\inetpub\wwwroot\documents\file-0.pdf";
return new PhysicalFileResult(filename, "application/pdf");
case 1:
filename = @"C:\inetpub\wwwroot\documents\file-1.pdf";
return new PhysicalFileResult(filename, "application/pdf");
default:
return NotFound();
}
}
}
}
References
https://en.wikipedia.org/wiki/ASP.NET_Core
https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-5.0