diff --git a/src/Umbraco.Core/IO/UmbracoMediaFile.cs b/src/Umbraco.Core/IO/UmbracoMediaFile.cs index b8fe310f54..d708fcb804 100644 --- a/src/Umbraco.Core/IO/UmbracoMediaFile.cs +++ b/src/Umbraco.Core/IO/UmbracoMediaFile.cs @@ -199,8 +199,8 @@ namespace Umbraco.Core.IO using (var image = Image.FromStream(fs)) { var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) - : string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}." + Extension, Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); var thumbnail = maxWidthHeight == -1 ? ImageHelper.GenerateThumbnail(image, width, height, fileNameThumb, Extension, _fs) diff --git a/src/Umbraco.Core/Media/ImageHelper.cs b/src/Umbraco.Core/Media/ImageHelper.cs index 5842bb67bb..99fc278e61 100644 --- a/src/Umbraco.Core/Media/ImageHelper.cs +++ b/src/Umbraco.Core/Media/ImageHelper.cs @@ -59,7 +59,7 @@ namespace Umbraco.Core.Media var fileHeight = image.Height; return new Size(fileWidth, fileHeight); } - + } public static string GetMimeType(this Image image) @@ -79,22 +79,22 @@ namespace Umbraco.Core.Media /// /// internal static IEnumerable GenerateMediaThumbnails( - IFileSystem fs, - string fileName, - string extension, + IFileSystem fs, + string fileName, + string extension, Image originalImage, IEnumerable additionalThumbSizes) { var result = new List(); - var allSizesDictionary = new Dictionary {{100,"thumb"}, {500,"big-thumb"}}; - + var allSizesDictionary = new Dictionary { { 100, "thumb" }, { 500, "big-thumb" } }; + //combine the static dictionary with the additional sizes with only unique values var allSizes = allSizesDictionary.Select(kv => kv.Key) .Union(additionalThumbSizes.Where(x => x > 0).Distinct()); - var sizesDictionary = allSizes.ToDictionary(s => s, s => allSizesDictionary.ContainsKey(s) ? allSizesDictionary[s]: ""); + var sizesDictionary = allSizes.ToDictionary(s => s, s => allSizesDictionary.ContainsKey(s) ? allSizesDictionary[s] : ""); foreach (var s in sizesDictionary) { @@ -121,9 +121,9 @@ namespace Umbraco.Core.Media /// private static ResizedImage Resize(IFileSystem fileSystem, string path, string extension, int maxWidthHeight, string fileNameAddition, Image originalImage) { - var fileNameThumb = String.IsNullOrEmpty(fileNameAddition) - ? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", path.Substring(0, path.LastIndexOf("."))) - : string.Format("{0}_{1}.jpg", path.Substring(0, path.LastIndexOf(".")), fileNameAddition); + var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition) + ? string.Format("{0}_UMBRACOSYSTHUMBNAIL." + extension, path.Substring(0, path.LastIndexOf(".", StringComparison.Ordinal))) + : string.Format("{0}_{1}." + extension, path.Substring(0, path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition); var thumb = GenerateThumbnail( originalImage, @@ -190,9 +190,9 @@ namespace Umbraco.Core.Media //use best quality g.InterpolationMode = InterpolationMode.HighQualityBicubic; } - - g.SmoothingMode = SmoothingMode.HighQuality; + + g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; @@ -202,10 +202,29 @@ namespace Umbraco.Core.Media // Copy metadata var imageEncoders = ImageCodecInfo.GetImageEncoders(); - - var codec = extension.ToLower() == "png" || extension.ToLower() == "gif" - ? imageEncoders.Single(t => t.MimeType.Equals("image/png")) - : imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + ImageCodecInfo codec; + switch (extension.ToLower()) + { + case "png": + codec = imageEncoders.Single(t => t.MimeType.Equals("image/png")); + break; + case "gif": + codec = imageEncoders.Single(t => t.MimeType.Equals("image/gif")); + break; + case "tif": + case "tiff": + codec = imageEncoders.Single(t => t.MimeType.Equals("image/tiff")); + break; + case "bmp": + codec = imageEncoders.Single(t => t.MimeType.Equals("image/bmp")); + break; + // TODO: this is dirty, defaulting to jpg but the return value of this thing is used all over the + // place so left it here, but it needs to not set a codec if it doesn't know which one to pick + // Note: when fixing this: both .jpg and .jpeg should be handled as extensions + default: + codec = imageEncoders.Single(t => t.MimeType.Equals("image/jpeg")); + break; + } // Set compresion ratio to 90% var ep = new EncoderParameters(); @@ -213,12 +232,14 @@ namespace Umbraco.Core.Media // Save the new image using the dimensions of the image var predictableThumbnailName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", maxWidthHeight.ToString(CultureInfo.InvariantCulture)); + var predictableThumbnailNameJpg = predictableThumbnailName.Substring(0, predictableThumbnailName.LastIndexOf(".", StringComparison.Ordinal)) + ".jpg"; using (var ms = new MemoryStream()) { bp.Save(ms, codec, ep); ms.Seek(0, 0); fs.AddFile(predictableThumbnailName, ms); + fs.AddFile(predictableThumbnailNameJpg, ms); } // TODO: Remove this, this is ONLY here for backwards compatibility but it is essentially completely unusable see U4-5385 diff --git a/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx b/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx index 6388b243ee..21d18dd7ad 100644 --- a/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx +++ b/src/Umbraco.Web.UI/umbraco/plugins/tinymce3/insertImage.aspx @@ -133,7 +133,7 @@ //get the thumb of the image var src = document.forms[0].src.value; var ext = src.split('.').pop(); - var thumb = src.replace("." + ext, "_thumb.jpg"); + var thumb = src.replace("." + ext, "_thumb." + ext); if (src != "") jQuery("#<%=ImageViewer.ClientID%>").UmbracoImageViewerAPI().showImage(thumb); } }, 500); diff --git a/src/Umbraco.Web/Editors/ImagesController.cs b/src/Umbraco.Web/Editors/ImagesController.cs index 39960317b1..f69f84ca86 100644 --- a/src/Umbraco.Web/Editors/ImagesController.cs +++ b/src/Umbraco.Web/Editors/ImagesController.cs @@ -124,7 +124,7 @@ namespace Umbraco.Web.Editors return Request.CreateResponse(HttpStatusCode.NotFound); } - var thumbFilePath = imagePath.TrimEnd(ext) + "_" + suffix + ".jpg"; + var thumbFilePath = imagePath.TrimEnd(ext) + "_" + suffix + ext; var fullOrgPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(imagePath)); var fullNewPath = mediaFileSystem.GetFullPath(mediaFileSystem.GetRelativePath(thumbFilePath)); var thumbIsNew = mediaFileSystem.FileExists(fullNewPath) == false; @@ -148,7 +148,7 @@ namespace Umbraco.Web.Editors originalImage, width, fullNewPath, - "jpg", + ext.Replace(".", ""), mediaFileSystem); } else @@ -168,7 +168,8 @@ namespace Umbraco.Web.Editors if (stream.CanSeek) stream.Seek(0, 0); result.Content = new StreamContent(stream); result.Headers.Date = mediaFileSystem.GetLastModified(imagePath); - result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); + result.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(imagePath)); + return result; } } diff --git a/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs b/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs index a2777c0137..6f9b26c79d 100644 --- a/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs +++ b/src/Umbraco.Web/Media/ThumbnailProviders/ImageThumbnailProvider.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.Media.ThumbnailProviders return false; // Make sure the thumbnail exists - var tmpThumbUrl = fileUrl.Replace(ext, "_thumb.jpg"); + var tmpThumbUrl = fileUrl.Replace(ext, "_thumb" + ext); try { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs index eaf2eb5b82..98362dd638 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs @@ -110,7 +110,7 @@ namespace umbraco.controls.Images } string ext = MediaItemPath.Substring(MediaItemPath.LastIndexOf(".") + 1, MediaItemPath.Length - MediaItemPath.LastIndexOf(".") - 1); - MediaItemThumbnailPath = MediaItemPath.Replace("." + ext, "_thumb.jpg"); + MediaItemThumbnailPath = MediaItemPath.Replace("." + ext, "_thumb." + ext); ImageFound = true; } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs index 71b32f2b61..24d115c6d6 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/UploadMediaImage.ascx.cs @@ -81,7 +81,7 @@ namespace umbraco.controls.Images //this seems real ugly since we apparently already have the properties above (props)... but this data layer is insane and undecipherable:) string mainImage = media.getProperty(Constants.Conventions.Media.File).Value.ToString(); string extension = mainImage.Substring(mainImage.LastIndexOf(".") + 1, mainImage.Length - mainImage.LastIndexOf(".") - 1); - var thumbnail = mainImage.Remove(mainImage.Length - extension.Length - 1, extension.Length + 1) + "_thumb.jpg"; + var thumbnail = mainImage.Remove(mainImage.Length - extension.Length - 1, extension.Length + 1) + "_thumb." + extension; string width = media.getProperty(Constants.Conventions.Media.Width).Value.ToString(); string height = media.getProperty(Constants.Conventions.Media.Height).Value.ToString(); int id = media.Id; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs index 3a2917f24f..f7f129dbed 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/imageViewer.aspx.cs @@ -76,7 +76,7 @@ namespace umbraco.dialogs } var fileNameOrg = fileName; var ext = fileNameOrg.Substring(fileNameOrg.LastIndexOf(".") + 1, fileNameOrg.Length - fileNameOrg.LastIndexOf(".") - 1); - var fileNameThumb = SystemDirectories.Root + fileNameOrg.Replace("." + ext, "_thumb.jpg"); + var fileNameThumb = SystemDirectories.Root + fileNameOrg.Replace("." + ext, "_thumb." + ext); image.Controls.Add(new LiteralControl("")); } catch diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx index 1ae2936713..7c4a878ee5 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/insertImage.aspx @@ -133,7 +133,7 @@ //get the thumb of the image var src = document.forms[0].src.value; var ext = src.split('.').pop(); - var thumb = src.replace("." + ext, "_thumb.jpg"); + var thumb = src.replace("." + ext, "_thumb." + ext); if (src != "") jQuery("#<%=ImageViewer.ClientID%>").UmbracoImageViewerAPI().showImage(thumb); } }, 500); diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs index f52100d9c9..42b9cd757b 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs @@ -216,7 +216,7 @@ namespace umbraco if (!string.IsNullOrEmpty(url)) { var extension = media.GetProperty(Constants.Conventions.Media.Extension); - return url.Replace(string.Concat(".", extension), "_thumb.jpg", StringComparison.InvariantCultureIgnoreCase); + return url.Replace(string.Concat(".", extension), "_thumb." + extension, StringComparison.InvariantCultureIgnoreCase); } } diff --git a/src/umbraco.editorControls/uploadfield/uploadField.cs b/src/umbraco.editorControls/uploadfield/uploadField.cs index 9e0ac6716f..6f795e1ad9 100644 --- a/src/umbraco.editorControls/uploadfield/uploadField.cs +++ b/src/umbraco.editorControls/uploadfield/uploadField.cs @@ -20,16 +20,16 @@ namespace umbraco.editorControls public class uploadField : HtmlInputFile, IDataEditor { private const string Thumbnailext = ".jpg"; - private readonly cms.businesslogic.datatype.FileHandlerData _data; + private readonly cms.businesslogic.datatype.FileHandlerData _data; private readonly string _thumbnails; private string _text; - private readonly MediaFileSystem _fs; + private readonly MediaFileSystem _fs; private CustomValidator _customValidator; public uploadField(IData Data, string ThumbnailSizes) { _fs = FileSystemProviderManager.Current.GetFileSystemProvider(); - _data = (cms.businesslogic.datatype.FileHandlerData) Data; //this is always FileHandlerData + _data = (cms.businesslogic.datatype.FileHandlerData)Data; //this is always FileHandlerData _thumbnails = ThumbnailSizes; } @@ -40,7 +40,7 @@ namespace umbraco.editorControls _customValidator = new CustomValidator { - EnableClientScript = false, + EnableClientScript = false, Display = ValidatorDisplay.Dynamic, ErrorMessage = ui.Text("errors", "dissallowedMediaType") }; @@ -71,8 +71,8 @@ namespace umbraco.editorControls return ""; if (isEmpty == false) return PostedFile.FileName; - return string.IsNullOrEmpty(tempText) == false - ? tempText + return string.IsNullOrEmpty(tempText) == false + ? tempText : ""; } } @@ -87,7 +87,7 @@ namespace umbraco.editorControls //return true if there is no file if (postedFile == null) return true; if (postedFile.FileName.IsNullOrWhiteSpace()) return true; - + //now check the file type var extension = Path.GetExtension(postedFile.FileName).TrimStart("."); @@ -169,12 +169,12 @@ namespace umbraco.editorControls { var content = _data.LoadedContentItem; - // update extension in UI - UpdateLabelValue(Constants.Conventions.Media.Extension, "prop_umbracoExtension", Page, content); + // update extension in UI + UpdateLabelValue(Constants.Conventions.Media.Extension, "prop_umbracoExtension", Page, content); // update file size in UI - UpdateLabelValue(Constants.Conventions.Media.Bytes, "prop_umbracoBytes", Page, content); - UpdateLabelValue(Constants.Conventions.Media.Width, "prop_umbracoWidth", Page, content); - UpdateLabelValue(Constants.Conventions.Media.Height, "prop_umbracoHeight", Page, content); + UpdateLabelValue(Constants.Conventions.Media.Bytes, "prop_umbracoBytes", Page, content); + UpdateLabelValue(Constants.Conventions.Media.Width, "prop_umbracoWidth", Page, content); + UpdateLabelValue(Constants.Conventions.Media.Height, "prop_umbracoHeight", Page, content); } } @@ -199,8 +199,8 @@ namespace umbraco.editorControls [Obsolete("This method is now obsolete due to a change in the way that files are handled. If you need to check if a URL for an uploaded file is safe you should implement your own as this method will be removed in a future version", false)] public string SafeUrl(string url) { - return string.IsNullOrEmpty(url) == false - ? Regex.Replace(url, @"[^a-zA-Z0-9\-\.\/\:]{1}", "_") + return string.IsNullOrEmpty(url) == false + ? Regex.Replace(url, @"[^a-zA-Z0-9\-\.\/\:]{1}", "_") : String.Empty; } @@ -263,7 +263,7 @@ namespace umbraco.editorControls } } } - + /// /// Render this control to the output parameter specified. /// @@ -283,17 +283,24 @@ namespace umbraco.editorControls { var relativeFilePath = _fs.GetRelativePath(_text); var ext = relativeFilePath.Substring(relativeFilePath.LastIndexOf(".") + 1, relativeFilePath.Length - relativeFilePath.LastIndexOf(".") - 1); - var relativeThumbFilePath = relativeFilePath.Replace("." + ext, "_thumb.jpg"); - var hasThumb = false; + var relativeThumbFilePath = relativeFilePath.Replace("." + ext, "_thumb." + ext); + var hasThumb = false; try { hasThumb = _fs.FileExists(relativeThumbFilePath); - // 4.8.0 added support for png thumbnails (but for legacy it might have been jpg - hence the check before) - if (hasThumb == false && (ext == "gif" || ext == "png")) + + // 7.4.0 generates thumbs with the correct file extension, but check for old possible extensions as well + if (hasThumb == false) { relativeThumbFilePath = relativeFilePath.Replace("." + ext, "_thumb.png"); hasThumb = _fs.FileExists(relativeThumbFilePath); } + + if (hasThumb == false) + { + relativeThumbFilePath = relativeFilePath.Replace("." + ext, "_thumb.jpg"); + hasThumb = _fs.FileExists(relativeThumbFilePath); + } } catch { @@ -302,7 +309,7 @@ namespace umbraco.editorControls { var thumb = new Image { - ImageUrl = _fs.GetUrl(relativeThumbFilePath), + ImageUrl = _fs.GetUrl(relativeThumbFilePath), BorderStyle = BorderStyle.None };