FileController - content disposition

This commit is contained in:
Pavel Vesely 2020-12-15 10:49:48 +01:00
parent deaaa74fc8
commit 07711c082e
5 changed files with 93 additions and 27 deletions

View File

@ -116,7 +116,12 @@ namespace Oqtane.Modules
public string ContentUrl(int fileid)
{
return Utilities.ContentUrl(PageState.Alias, fileid);
return ContentUrl(fileid, false);
}
public string ContentUrl(int fileid, bool asAttachment)
{
return Utilities.ContentUrl(PageState.Alias, fileid, asAttachment);
}
public virtual Dictionary<string, string> GetUrlParameters(string parametersTemplate = "")

View File

@ -147,8 +147,10 @@ namespace Oqtane.Controllers
{
Directory.CreateDirectory(folderpath);
}
System.IO.File.Move(Path.Combine(GetFolderPath(_file.Folder), _file.Name), Path.Combine(folderpath, file.Name));
}
file.Extension = Path.GetExtension(file.Name).ToLower().Replace(".", "");
file = _files.UpdateFile(file);
_logger.Log(LogLevel.Information, this, LogFunction.Update, "File Updated {File}", file);
@ -432,9 +434,38 @@ namespace Oqtane.Controllers
return canaccess;
}
/// <summary>
/// Get file with header
/// Content-Disposition: inline
/// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
/// </summary>
/// <param name="id">File Id from Oqtane filesystem </param>
/// <returns>file content</returns>
// GET api/<controller>/download/5
[HttpGet("download/{id}")]
public IActionResult Download(int id)
public IActionResult DownloadInline(int id)
{
return Download(id, false);
}
/// <summary>
/// Get file with header
/// Content-Disposition: attachment; filename="filename.jpg"
/// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
///
/// </summary>
/// <param name="id">File Id from Oqtane filesystem</param>
/// <returns></returns>
// GET api/<controller>/download/5/attach
[HttpGet("download/{id}/attach")]
public IActionResult DownloadAttachment(int id)
{
return Download(id, true);
}
private IActionResult Download(int id, bool asAttachment)
{
var file = _files.GetFile(id);
if (file != null)
@ -444,7 +475,10 @@ namespace Oqtane.Controllers
var filepath = Path.Combine(GetFolderPath(file.Folder), file.Name);
if (System.IO.File.Exists(filepath))
{
return PhysicalFile(filepath, file.Name.GetMimeType(), file.Name);
var result = asAttachment
? PhysicalFile(filepath, file.GetMimeType(), file.Name)
: PhysicalFile(filepath, file.GetMimeType());
return result;
}
_logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath);
@ -461,8 +495,9 @@ namespace Oqtane.Controllers
_logger.Log(LogLevel.Error, this, LogFunction.Read, "File Not Found {FileId}", id);
HttpContext.Response.StatusCode = 404;
}
string errorPath = Path.Combine(GetFolderPath("images"), "error.png");
return System.IO.File.Exists(errorPath) ? PhysicalFile(errorPath, errorPath.GetMimeType()) : null;
return System.IO.File.Exists(errorPath) ? PhysicalFile(errorPath, MimeUtilities.GetMimeType(errorPath)) : null;
}
private string GetFolderPath(Folder folder)

View File

@ -0,0 +1,31 @@
using Microsoft.AspNetCore.StaticFiles;
using Oqtane.Models;
namespace Oqtane.Extensions
{
public static class MimeUtilities
{
/// <summary>
/// Return Mime content type based on file extension
/// </summary>
/// <param name="fileName">File name</param>
public static string GetMimeType(string fileName)
{
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(fileName, out var contentType))
contentType = "application/octet-stream";
// we can add additional mappings here
return contentType;
}
/// <summary>
/// Return Mime content type based on file extension
/// </summary>
public static string GetMimeType(this File file)
{
return GetMimeType(file?.Name);
}
}
}

View File

@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.StaticFiles;
using Oqtane.Models;
namespace Oqtane.Extensions
{
@ -15,17 +16,5 @@ namespace Oqtane.Extensions
return list.Any(f => s.StartsWith(f));
}
public static string GetMimeType(this string fileName)
{
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(fileName, out var contentType))
{
contentType = "application/octet-stream";
}
return contentType;
}
}
}

View File

@ -95,11 +95,17 @@ namespace Oqtane.Shared
return NavigateUrl(alias, path, parameters);
}
public static string ContentUrl(Alias alias, int fileid)
public static string ContentUrl(Alias alias, int fileId)
{
string url = (alias == null) ? "/~" : "/" + alias.AliasId;
url += Constants.ContentUrl + fileid.ToString();
return url;
return ContentUrl(alias, fileId, false);
}
public static string ContentUrl(Alias alias, int fileId, bool asAttachment)
{
var aliasUrl = (alias == null) ? "/~" : "/" + alias.AliasId;
var method = asAttachment ? "/attach":"";
return $"{aliasUrl}{Constants.ContentUrl}{fileId}{method}";
}
public static string GetTypeName(string fullyqualifiedtypename)