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
|
AntiForgery: enabled
|
||||||
Author: The Orchard Team
|
Author: The Orchard Team
|
||||||
Website: http://orchardproject.net
|
Website: http://orchardproject.net
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user