From 45484507b1943e0afd430acd50482886ff2db07a Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 27 Jun 2013 18:08:11 -0700 Subject: [PATCH] Fixing duplicated media items during upgrade --HG-- branch : 1.x --- .../Upgrade/Controllers/MediaController.cs | 38 +++++++++++++++---- .../Media/FileSystemStorageProvider.cs | 4 +- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Orchard.Web/Modules/Upgrade/Controllers/MediaController.cs b/src/Orchard.Web/Modules/Upgrade/Controllers/MediaController.cs index dc868c594..c62b112a7 100644 --- a/src/Orchard.Web/Modules/Upgrade/Controllers/MediaController.cs +++ b/src/Orchard.Web/Modules/Upgrade/Controllers/MediaController.cs @@ -73,8 +73,29 @@ namespace Upgrade.Controllers { // create the folder in Media Library int? parentMediaFolderId = parentMediaFolder != null ? (int?)parentMediaFolder.TermId : null; + Orchard.MediaLibrary.Models.MediaFolder mediaLibraryFolder = null; - var mediaLibraryFolder = _mediaLibraryService.CreateFolder(parentMediaFolderId, mediaFolder.Name); + var candidateFolders = Enumerable.Empty(); + + if (parentMediaFolderId.HasValue) { + var parentMediaFolderTerm = _mediaLibraryService.GetMediaFolder(parentMediaFolderId.Value); + if (parentMediaFolderTerm != null) { + candidateFolders = parentMediaFolderTerm.Folders; + } + } + else { + candidateFolders = _mediaLibraryService.GetMediaFolders(); + } + + var match = candidateFolders.FirstOrDefault(x => x.Name.Equals(mediaFolder.Name, StringComparison.OrdinalIgnoreCase)); + + // if we find an existing term reuse it + if (match != null) { + mediaLibraryFolder = match; + } + else { + mediaLibraryFolder = _mediaLibraryService.CreateFolder(parentMediaFolderId, mediaFolder.Name); + } foreach (var mediaFile in _mediaService.GetMediaFiles(mediaFolder.MediaPath)) { ImportMediaFile(mediaFile, mediaLibraryFolder); @@ -89,20 +110,23 @@ namespace Upgrade.Controllers { private void ImportMediaFile(MediaFile mediaFile, Orchard.MediaLibrary.Models.MediaFolder mediaLibraryFolder) { // foreach media file, if there is no media with the same url, import it + var prefix = _mediaService.GetPublicUrl("foo.$$$"); + var trim = prefix.IndexOf("foo.$$$"); + var canonicalFileName = mediaFile.MediaPath.Substring(trim); + var fileName = Path.GetFileName(canonicalFileName); + var contentManager = _orchardServices.ContentManager; - var media = contentManager.Query().ForPart().Where(x => x.Resource.EndsWith(mediaFile.MediaPath)).Slice(0, 1).FirstOrDefault(); + var media = contentManager.Query().ForPart().Where(x => x.Resource.EndsWith("/" + fileName)).Slice(0, 1).FirstOrDefault(); if (media != null) { - _orchardServices.Notifier.Information(T("Media {0} has already been imported.", mediaFile.MediaPath)); + _orchardServices.Notifier.Warning(T("Media {0} has already been imported.", mediaFile.MediaPath)); return; } try { - var prefix = _mediaService.GetPublicUrl("foo.$$$"); - var trim = prefix.IndexOf("foo.$$$"); - _orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath)); - var storageFile = _storageProvider.GetFile(mediaFile.MediaPath.Substring(trim)); + var storageFile = _storageProvider.GetFile(canonicalFileName); + using (var stream = storageFile.OpenRead()) { var filename = HttpUtility.UrlDecode(mediaFile.MediaPath); _mediaLibraryService.ImportStream(mediaLibraryFolder.TermId, stream, Path.GetFileName(filename)); diff --git a/src/Orchard/FileSystems/Media/FileSystemStorageProvider.cs b/src/Orchard/FileSystems/Media/FileSystemStorageProvider.cs index fff8d9427..781b55d9d 100644 --- a/src/Orchard/FileSystems/Media/FileSystemStorageProvider.cs +++ b/src/Orchard/FileSystems/Media/FileSystemStorageProvider.cs @@ -53,7 +53,7 @@ namespace Orchard.FileSystems.Media { /// The relative path to be mapped. /// The relative path combined with the public path in an URL friendly format ('/' character for directory separator). private string MapPublic(string path) { - return string.IsNullOrEmpty(path) ? _publicPath : Path.Combine(_publicPath, path).Replace(Path.DirectorySeparatorChar, '/').Replace(" ", "%20"); + return string.IsNullOrEmpty(path) ? _publicPath : Path.Combine(_publicPath, path).Replace(Path.DirectorySeparatorChar, '/'); } private static string Fix(string path) { @@ -102,7 +102,7 @@ namespace Orchard.FileSystems.Media { return url; } - return Combine("", url.Substring(_publicPath.Length).Replace("%20", " ")); + return Combine("", url.Substring(_publicPath.Length)); } ///