#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,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using Orchard;
using Orchard.Environment.Features;
using Orchard.FileSystems.Media;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.MediaLibrary.Models;
@@ -18,15 +20,19 @@ namespace Upgrade.Controllers {
private readonly IOrchardServices _orchardServices;
private readonly IFeatureManager _featureManager;
private readonly IEnumerable<IMediaLibraryService> _mediaLibraryServices;
private readonly IMimeTypeProvider _mimeTypeProvider;
private IMediaLibraryService _mediaLibraryService { get { return _mediaLibraryServices.FirstOrDefault(); }}
private int BATCH = 100;
public MediaController(
IOrchardServices orchardServices,
IFeatureManager featureManager,
IEnumerable<IMediaLibraryService> mediaLibraryServices) {
IEnumerable<IMediaLibraryService> mediaLibraryServices,
IMimeTypeProvider mimeTypeProvider) {
_orchardServices = orchardServices;
_featureManager = featureManager;
_mediaLibraryServices = mediaLibraryServices;
_mimeTypeProvider = mimeTypeProvider;
Logger = NullLogger.Instance;
}
@@ -41,6 +47,26 @@ namespace Upgrade.Controllers {
}
else {
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();
@@ -51,46 +77,68 @@ namespace Upgrade.Controllers {
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner, T("Not allowed to convert media files.")))
return new HttpUnauthorizedResult();
var count = 0;
var hasMore = false;
// crawl media file, ignore recipes and profiles
IEnumerable<MediaFolder> mediaFolders = _mediaLibraryService.GetMediaFolders(null);
foreach (var mediaFolder in mediaFolders) {
ImportMediaFolder(mediaFolder);
ImportMediaFolder(mediaFolder, x => {
if (count < BATCH) {
if (ImportMediaFile(x) != null) {
count++;
}
}
else {
hasMore = true;
}
});
}
_orchardServices.Notifier.Information(T("Media files were migrated successfully."));
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."));
}
return RedirectToAction("Index");
}
private void ImportMediaFolder(MediaFolder mediaFolder) {
private void ImportMediaFolder(MediaFolder mediaFolder, Action<MediaFile> action) {
foreach (var mediaFile in _mediaLibraryService.GetMediaFiles(mediaFolder.MediaPath)) {
ImportMediaFile(mediaFile);
action(mediaFile);
}
// recursive call on sub-folders
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
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();
if (media != null) {
_orchardServices.Notifier.Warning(T("Media {0} has already been imported.", mediaFile.MediaPath));
return;
// _orchardServices.Notifier.Warning(T("Media {0} has already been imported.", mediaFile.MediaPath));
return null;
}
try {
_orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath));
_mediaLibraryService.ImportMedia(mediaFile.FolderName, mediaFile.Name);
//_orchardServices.Notifier.Information(T("Importing {0}.", mediaFile.MediaPath));
return _mediaLibraryService.ImportMedia(mediaFile.FolderName, mediaFile.Name);
}
catch(Exception e) {
_orchardServices.Notifier.Error(T("Error while importing {0}. Please check the logs", mediaFile.MediaPath));
Logger.Error(e, "Error while importing {0}", mediaFile.MediaPath);
return null;
}
}
}

View File

@@ -7,6 +7,9 @@
<fieldset>
<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>
@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>
@if (ViewBag.CanMigrate) {