Fixing duplicated media items during upgrade

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2013-06-27 18:08:11 -07:00
parent 8e6d1cb9fa
commit 45484507b1
2 changed files with 33 additions and 9 deletions

View File

@@ -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<Orchard.MediaLibrary.Models.MediaFolder>();
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<MediaPart>().Where<MediaPartRecord>(x => x.Resource.EndsWith(mediaFile.MediaPath)).Slice(0, 1).FirstOrDefault();
var media = contentManager.Query().ForPart<MediaPart>().Where<MediaPartRecord>(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));

View File

@@ -53,7 +53,7 @@ namespace Orchard.FileSystems.Media {
/// <param name="path">The relative path to be mapped.</param>
/// <returns>The relative path combined with the public path in an URL friendly format ('/' character for directory separator).</returns>
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));
}
/// <summary>