FileController - content disposition
This commit is contained in:
		| @ -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 = "") | ||||
|  | ||||
| @ -66,7 +66,7 @@ namespace Oqtane.Controllers | ||||
|                     { | ||||
|                         foreach (string file in Directory.GetFiles(folder)) | ||||
|                         { | ||||
|                             files.Add(new Models.File { Name = Path.GetFileName(file), Extension = Path.GetExtension(file)?.Replace(".", "") }); | ||||
|                             files.Add(new Models.File {Name = Path.GetFileName(file), Extension = Path.GetExtension(file)?.Replace(".", "")}); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| @ -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); | ||||
| @ -221,7 +223,7 @@ namespace Oqtane.Controllers | ||||
|             { | ||||
|                 _logger.Log(LogLevel.Error, this, LogFunction.Create, | ||||
|                     "File Could Not Be Downloaded From Url Due To Its File Extension {Url}", url); | ||||
|                 HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict; | ||||
|                 HttpContext.Response.StatusCode = (int) HttpStatusCode.Conflict; | ||||
|                 return file; | ||||
|             } | ||||
|  | ||||
| @ -229,7 +231,7 @@ namespace Oqtane.Controllers | ||||
|             { | ||||
|                 _logger.Log(LogLevel.Error, this, LogFunction.Create, | ||||
|                     $"File Could Not Be Downloaded From Url Due To Its File Name Not Allowed {url}"); | ||||
|                 HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict; | ||||
|                 HttpContext.Response.StatusCode = (int) HttpStatusCode.Conflict; | ||||
|                 return file; | ||||
|             } | ||||
|  | ||||
| @ -266,7 +268,7 @@ namespace Oqtane.Controllers | ||||
|  | ||||
|             if (!file.FileName.IsPathOrFileValid()) | ||||
|             { | ||||
|                 HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict; | ||||
|                 HttpContext.Response.StatusCode = (int) HttpStatusCode.Conflict; | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
| @ -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) | ||||
| @ -480,7 +515,7 @@ namespace Oqtane.Controllers | ||||
|             if (!Directory.Exists(folderpath)) | ||||
|             { | ||||
|                 string path = ""; | ||||
|                 var separators = new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }; | ||||
|                 var separators = new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}; | ||||
|                 string[] folders = folderpath.Split(separators, StringSplitOptions.RemoveEmptyEntries); | ||||
|                 foreach (string folder in folders) | ||||
|                 { | ||||
| @ -501,7 +536,7 @@ namespace Oqtane.Controllers | ||||
|  | ||||
|             FileInfo fileinfo = new FileInfo(filepath); | ||||
|             file.Extension = fileinfo.Extension.ToLower().Replace(".", ""); | ||||
|             file.Size = (int)fileinfo.Length; | ||||
|             file.Size = (int) fileinfo.Length; | ||||
|             file.ImageHeight = 0; | ||||
|             file.ImageWidth = 0; | ||||
|  | ||||
|  | ||||
							
								
								
									
										31
									
								
								Oqtane.Server/Extensions/MimeUtilities.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Oqtane.Server/Extensions/MimeUtilities.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -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) | ||||
| @ -380,4 +386,4 @@ namespace Oqtane.Shared | ||||
|             return dictionary; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Pavel Vesely
					Pavel Vesely