mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
#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:
@@ -1,4 +1,4 @@
|
||||
Name: MultiTenancy
|
||||
Name: Multi Tenancy
|
||||
AntiForgery: enabled
|
||||
Author: The Orchard Team
|
||||
Website: http://orchardproject.net
|
||||
|
@@ -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 IMediaLibraryService _mediaLibraryService { get { return _mediaLibraryServices.FirstOrDefault(); }}
|
||||
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user