From 5da461af2d4a64c08d3d9f0d4368cdd692813ab3 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 13 Oct 2020 17:03:38 -0400 Subject: [PATCH] feat(storage): Extract MIME type from extension resolution to a dedicated service --- src/Uno.UWP/Storage/MimeTypeService.cs | 91 +++++++++++++++++++++++++ src/Uno.UWP/Storage/StorageFile.Base.cs | 2 +- src/Uno.UWP/Storage/StorageFile.cs | 81 ---------------------- 3 files changed, 92 insertions(+), 82 deletions(-) create mode 100644 src/Uno.UWP/Storage/MimeTypeService.cs diff --git a/src/Uno.UWP/Storage/MimeTypeService.cs b/src/Uno.UWP/Storage/MimeTypeService.cs new file mode 100644 index 000000000000..0dc1b46ddbf5 --- /dev/null +++ b/src/Uno.UWP/Storage/MimeTypeService.cs @@ -0,0 +1,91 @@ +#nullable enable + +namespace Windows.Storage +{ + internal static class MimeTypeService + { + /// + /// Gets the MIME type from the file extension (a.k.a. file type) + /// + public static string GetFromFileExtension(string? extension) + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types + => extension?.ToLowerInvariant() switch + { + ".aac" => "audio/aac", + ".abw" => "application/x-abiword", + ".arc" => "application/x-freearc", + ".avi" => "video/x-msvideo", + ".azw" => "application/vnd.amazon.ebook", + ".bin" => "application/octet-stream", + ".bmp" => "image/bmp", + ".bz" => "application/x-bzip", + ".bz2" => "application/x-bzip2", + ".csh" => "application/x-csh", + ".css" => "text/css", + ".csv" => "text/csv", + ".doc" => "application/msword", + ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ".eot" => "application/vnd.ms-fontobject", + ".epub" => "application/epub+zip", + ".gz" => "application/gzip", + ".gif" => "image/gif", + ".htm" => "text/html", + ".html" => "text/html", + ".ico" => "image/vnd.microsoft.icon", + ".ics" => "text/calendar", + ".jar" => "application/java-archive", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".js" => "text/javascript", + ".json" => "application/json", + ".jsonld" => "application/ld+json", + ".mid" => "audio/midi", + ".midi" => "audio/midi", + ".mjs" => "text/javascript", + ".mp3" => "audio/mpeg", + ".mpeg" => "video/mpeg", + ".mpkg" => "application/vnd.apple.installer+xml", + ".odp" => "application/vnd.oasis.opendocument.presentation", + ".ods" => "application/vnd.oasis.opendocument.spreadsheet", + ".odt" => "application/vnd.oasis.opendocument.text", + ".oga" => "audio/ogg", + ".ogv" => "video/ogg", + ".ogx" => "application/ogg", + ".opus" => "audio/opus", + ".otf" => "font/otf", + ".png" => "image/png", + ".pdf" => "application/pdf", + ".php" => "application/x-httpd-php", + ".ppt" => "application/vnd.ms-powerpoint", + ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ".rar" => "application/vnd.rar", + ".rtf" => "application/rtf", + ".sh" => "application/x-sh", + ".svg" => "image/svg+xml", + ".swf" => "application/x-shockwave-flash", + ".tar" => "application/x-tar", + ".tif" => "image/tiff", + ".tiff" => "image/tiff", + ".ts" => "video/mp2t", + ".ttf" => "font/ttf", + ".txt" => "text/plain", + ".vsd" => "application/vnd.visio", + ".wav" => "audio/wav", + ".weba" => "audio/webm", + ".webm" => "video/webm", + ".webp" => "image/webp", + ".woff" => "font/woff", + ".woff2" => "font/woff2", + ".xhtml" => "application/xhtml+xml", + ".xls" => "application/vnd.ms-excel", + ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ".xml" => "application/xml", + ".xul" => "application/vnd.mozilla.xul+xml", + ".zip" => "application/zip", + ".3gp" => "video/3gpp", + ".3g2" => "video/3gpp2", + ".7z" => "application/x-7z-compressed", + _ => "application/octet-stream", + }; + } +} diff --git a/src/Uno.UWP/Storage/StorageFile.Base.cs b/src/Uno.UWP/Storage/StorageFile.Base.cs index cc508d785bbb..18aa3d41752e 100644 --- a/src/Uno.UWP/Storage/StorageFile.Base.cs +++ b/src/Uno.UWP/Storage/StorageFile.Base.cs @@ -32,7 +32,7 @@ public void InitOwner(StorageFile owner) public virtual string DisplayName => global::System.IO.Path.GetFileNameWithoutExtension(Path); - public virtual string ContentType => GetContentTypeFromFileType(FileType); + public virtual string ContentType => MimeTypeService.GetFromFileExtension(FileType); public abstract DateTimeOffset DateCreated { get; } diff --git a/src/Uno.UWP/Storage/StorageFile.cs b/src/Uno.UWP/Storage/StorageFile.cs index ef3e7ba03577..5666ce700e86 100644 --- a/src/Uno.UWP/Storage/StorageFile.cs +++ b/src/Uno.UWP/Storage/StorageFile.cs @@ -221,87 +221,6 @@ private static async Task CreateDestination(CancellationToken ct, I return await destinationFolder.CreateFileAsync(desiredNewName, creationOption).AsTask(ct); } - - private static string GetContentTypeFromFileType(string fileType) - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types - => fileType.ToLowerInvariant() switch - { - ".aac" => "audio/aac", - ".abw" => "application/x-abiword", - ".arc" => "application/x-freearc", - ".avi" => "video/x-msvideo", - ".azw" => "application/vnd.amazon.ebook", - ".bin" => "application/octet-stream", - ".bmp" => "image/bmp", - ".bz" => "application/x-bzip", - ".bz2" => "application/x-bzip2", - ".csh" => "application/x-csh", - ".css" => "text/css", - ".csv" => "text/csv", - ".doc" => "application/msword", - ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".eot" => "application/vnd.ms-fontobject", - ".epub" => "application/epub+zip", - ".gz" => "application/gzip", - ".gif" => "image/gif", - ".htm" => "text/html", - ".html" => "text/html", - ".ico" => "image/vnd.microsoft.icon", - ".ics" => "text/calendar", - ".jar" => "application/java-archive", - ".jpeg" => "image/jpeg", - ".jpg" => "image/jpeg", - ".js" => "text/javascript", - ".json" => "application/json", - ".jsonld" => "application/ld+json", - ".mid" => "audio/midi", - ".midi" => "audio/midi", - ".mjs" => "text/javascript", - ".mp3" => "audio/mpeg", - ".mpeg" => "video/mpeg", - ".mpkg" => "application/vnd.apple.installer+xml", - ".odp" => "application/vnd.oasis.opendocument.presentation", - ".ods" => "application/vnd.oasis.opendocument.spreadsheet", - ".odt" => "application/vnd.oasis.opendocument.text", - ".oga" => "audio/ogg", - ".ogv" => "video/ogg", - ".ogx" => "application/ogg", - ".opus" => "audio/opus", - ".otf" => "font/otf", - ".png" => "image/png", - ".pdf" => "application/pdf", - ".php" => "application/x-httpd-php", - ".ppt" => "application/vnd.ms-powerpoint", - ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".rar" => "application/vnd.rar", - ".rtf" => "application/rtf", - ".sh" => "application/x-sh", - ".svg" => "image/svg+xml", - ".swf" => "application/x-shockwave-flash", - ".tar" => "application/x-tar", - ".tif" => "image/tiff", - ".tiff" => "image/tiff", - ".ts" => "video/mp2t", - ".ttf" => "font/ttf", - ".txt" => "text/plain", - ".vsd" => "application/vnd.visio", - ".wav" => "audio/wav", - ".weba" => "audio/webm", - ".webm" => "video/webm", - ".webp" => "image/webp", - ".woff" => "font/woff", - ".woff2" => "font/woff2", - ".xhtml" => "application/xhtml+xml", - ".xls" => "application/vnd.ms-excel", - ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xml" => "application/xml", - ".xul" => "application/vnd.mozilla.xul+xml", - ".zip" => "application/zip", - ".3gp" => "video/3gpp", - ".3g2" => "video/3gpp2", - ".7z" => "application/x-7z-compressed", - _ => "application/octet-stream", - }; #endregion } }