#19867, 19880: Improving media upgrade

- Adding a mime type check before importing media items
- Batching imported files by 100

Work Items: 19880, 19867

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2013-07-11 10:43:20 -07:00
parent 7d19c8de7a
commit 4464d72c91
3 changed files with 65 additions and 14 deletions

View File

@@ -1,4 +1,4 @@
Name: MultiTenancy Name: Multi Tenancy
AntiForgery: enabled AntiForgery: enabled
Author: The Orchard Team Author: The Orchard Team
Website: http://orchardproject.net Website: http://orchardproject.net

View File

@@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Orchard; using Orchard;
using Orchard.Environment.Features; using Orchard.Environment.Features;
using Orchard.FileSystems.Media;
using Orchard.Localization; using Orchard.Localization;
using Orchard.Logging; using Orchard.Logging;
using Orchard.MediaLibrary.Models; using Orchard.MediaLibrary.Models;
@@ -18,15 +20,19 @@ namespace Upgrade.Controllers {
private readonly IOrchardServices _orchardServices; private readonly IOrchardServices _orchardServices;
private readonly IFeatureManager _featureManager; private readonly IFeatureManager _featureManager;
private readonly IEnumerable<IMediaLibraryService> _mediaLibraryServices; private readonly IEnumerable<IMediaLibraryService> _mediaLibraryServices;
private IMediaLibraryService _mediaLibraryService { get { return _mediaLibraryServices.FirstOrDefault(); }} private readonly IMimeTypeProvider _mimeTypeProvider;
private IMediaLibraryService _mediaLibraryService { get { return _mediaLibraryServices.FirstOrDefault(); }}
private int BATCH = 100;
public MediaController( public MediaController(
IOrchardServices orchardServices, IOrchardServices orchardServices,
IFeatureManager featureManager, IFeatureManager featureManager,
IEnumerable<IMediaLibraryService> mediaLibraryServices) { IEnumerable<IMediaLibraryService> mediaLibraryServices,
IMimeTypeProvider mimeTypeProvider) {
_orchardServices = orchardServices; _orchardServices = orchardServices;
_featureManager = featureManager; _featureManager = featureManager;
_mediaLibraryServices = mediaLibraryServices; _mediaLibraryServices = mediaLibraryServices;
_mimeTypeProvider = mimeTypeProvider;
Logger = NullLogger.Instance; Logger = NullLogger.Instance;
} }
@@ -41,6 +47,26 @@ namespace Upgrade.Controllers {
} }
else { else {
ViewBag.CanMigrate = true; ViewBag.CanMigrate = true;
var extensions = new HashSet<string>();
// crawl media file for all file extensions
_mediaLibraryService.GetMediaFolders(null).ToList()
.ForEach(mediaFolder => ImportMediaFolder(mediaFolder, x => {
if (!String.IsNullOrWhiteSpace(x.MediaPath)) {
var extension = Path.GetExtension(x.MediaPath);
if (!String.IsNullOrWhiteSpace(extension)) {
extensions.Add(extension);
}
}
}));
foreach (var extension in extensions) {
if (_mimeTypeProvider.GetMimeType("." + extension) == "application/unknown") {
_orchardServices.Notifier.Warning(T("Unknown MIME type: {0}", extension));
ViewBag.CanMigrate = false;
}
}
} }
return View(); return View();
@@ -51,46 +77,68 @@ namespace Upgrade.Controllers {
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to convert media files."))) if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to convert media files.")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();
var count = 0;
var hasMore = false;
// crawl media file, ignore recipes and profiles // crawl media file, ignore recipes and profiles
IEnumerable<MediaFolder> mediaFolders = _mediaLibraryService.GetMediaFolders(null); IEnumerable<MediaFolder> mediaFolders = _mediaLibraryService.GetMediaFolders(null);
foreach (var mediaFolder in mediaFolders) { foreach (var mediaFolder in mediaFolders) {
ImportMediaFolder(mediaFolder); ImportMediaFolder(mediaFolder, x => {
if (count < BATCH) {
if (ImportMediaFile(x) != null) {
count++;
}
}
else {
hasMore = true;
}
});
}
if (count > 0) {
_orchardServices.Notifier.Information(T("{0} media files were imported.", count));
}
if (hasMore && count <= BATCH) {
_orchardServices.Notifier.Information(T("More than {0} media files were found, please import again.", BATCH));
}
else {
_orchardServices.Notifier.Information(T("All media files were imported."));
} }
_orchardServices.Notifier.Information(T("Media files were migrated successfully."));
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
private void ImportMediaFolder(MediaFolder mediaFolder) { private void ImportMediaFolder(MediaFolder mediaFolder, Action<MediaFile> action) {
foreach (var mediaFile in _mediaLibraryService.GetMediaFiles(mediaFolder.MediaPath)) { foreach (var mediaFile in _mediaLibraryService.GetMediaFiles(mediaFolder.MediaPath)) {
ImportMediaFile(mediaFile); action(mediaFile);
} }
// recursive call on sub-folders // recursive call on sub-folders
foreach (var subMediaFolder in _mediaLibraryService.GetMediaFolders(mediaFolder.MediaPath)) { foreach (var subMediaFolder in _mediaLibraryService.GetMediaFolders(mediaFolder.MediaPath)) {
ImportMediaFolder(subMediaFolder); ImportMediaFolder(subMediaFolder, action);
} }
} }
private void ImportMediaFile(MediaFile mediaFile) { private MediaPart ImportMediaFile(MediaFile mediaFile) {
// 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 contentManager = _orchardServices.ContentManager; var contentManager = _orchardServices.ContentManager;
var media = contentManager.Query().ForPart<MediaPart>().Where<MediaPartRecord>(x => x.FolderPath == mediaFile.FolderName && x.FileName == mediaFile.Name).Slice(0, 1).FirstOrDefault(); var media = contentManager.Query().ForPart<MediaPart>().Where<MediaPartRecord>(x => x.FolderPath == mediaFile.FolderName && x.FileName == mediaFile.Name).Slice(0, 1).FirstOrDefault();
if (media != null) { if (media != null) {
_orchardServices.Notifier.Warning(T("Media {0} has already been imported.", mediaFile.MediaPath)); // _orchardServices.Notifier.Warning(T("Media {0} has already been imported.", mediaFile.MediaPath));
return; return null;
} }
try { try {
_orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath)); //_orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath));
_mediaLibraryService.ImportMedia(mediaFile.FolderName, mediaFile.Name); return _mediaLibraryService.ImportMedia(mediaFile.FolderName, mediaFile.Name);
} }
catch(Exception e) { catch(Exception e) {
_orchardServices.Notifier.Error(T("Error while importing {0}. Please check the logs", mediaFile.MediaPath)); _orchardServices.Notifier.Error(T("Error while importing {0}. Please check the logs", mediaFile.MediaPath));
Logger.Error(e, "Error while importing {0}", mediaFile.MediaPath); Logger.Error(e, "Error while importing {0}", mediaFile.MediaPath);
return null;
} }
} }
} }

View File

@@ -7,6 +7,9 @@
<fieldset> <fieldset>
<legend>@T("Migrating Media Files:")</legend> <legend>@T("Migrating Media Files:")</legend>
<span class="hint">@T("This migration step will create and organize new Media Content Items based on the media files in your ~/Media folder.")</span> <span class="hint">@T("This migration step will create and organize new Media Content Items based on the media files in your ~/Media folder.")</span>
@if (ViewBag.CanMigrate) {
<span class="hint">@T("Before importing, please ensure the server has the expected mime types already registered as explained here: <a href=\"http://www.iis.net/configreference/system.webserver/staticcontent/mimemap\">http://www.iis.net/configreference/system.webserver/staticcontent/mimemap</a>")</span>
}
</fieldset> </fieldset>
<fieldset> <fieldset>
@if (ViewBag.CanMigrate) { @if (ViewBag.CanMigrate) {