mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-02 03:17:32 +08:00
Fixing duplicated media items during upgrade
--HG-- branch : 1.x
This commit is contained in:
@@ -73,8 +73,29 @@ namespace Upgrade.Controllers {
|
|||||||
// create the folder in Media Library
|
// create the folder in Media Library
|
||||||
|
|
||||||
int? parentMediaFolderId = parentMediaFolder != null ? (int?)parentMediaFolder.TermId : null;
|
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)) {
|
foreach (var mediaFile in _mediaService.GetMediaFiles(mediaFolder.MediaPath)) {
|
||||||
ImportMediaFile(mediaFile, mediaLibraryFolder);
|
ImportMediaFile(mediaFile, mediaLibraryFolder);
|
||||||
@@ -89,20 +110,23 @@ namespace Upgrade.Controllers {
|
|||||||
private void ImportMediaFile(MediaFile mediaFile, Orchard.MediaLibrary.Models.MediaFolder mediaLibraryFolder) {
|
private void ImportMediaFile(MediaFile mediaFile, Orchard.MediaLibrary.Models.MediaFolder mediaLibraryFolder) {
|
||||||
// foreach media file, if there is no media with the same url, import it
|
// 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 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) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var prefix = _mediaService.GetPublicUrl("foo.$$$");
|
|
||||||
var trim = prefix.IndexOf("foo.$$$");
|
|
||||||
|
|
||||||
_orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath));
|
_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()) {
|
using (var stream = storageFile.OpenRead()) {
|
||||||
var filename = HttpUtility.UrlDecode(mediaFile.MediaPath);
|
var filename = HttpUtility.UrlDecode(mediaFile.MediaPath);
|
||||||
_mediaLibraryService.ImportStream(mediaLibraryFolder.TermId, stream, Path.GetFileName(filename));
|
_mediaLibraryService.ImportStream(mediaLibraryFolder.TermId, stream, Path.GetFileName(filename));
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ namespace Orchard.FileSystems.Media {
|
|||||||
/// <param name="path">The relative path to be mapped.</param>
|
/// <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>
|
/// <returns>The relative path combined with the public path in an URL friendly format ('/' character for directory separator).</returns>
|
||||||
private string MapPublic(string path) {
|
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) {
|
private static string Fix(string path) {
|
||||||
@@ -102,7 +102,7 @@ namespace Orchard.FileSystems.Media {
|
|||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Combine("", url.Substring(_publicPath.Length).Replace("%20", " "));
|
return Combine("", url.Substring(_publicPath.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user