mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Adjusting Orchard.Media module for storage path conventions
IMediaService no longer calculates root path as physical folder Public urls are provided by IStorageProvider --HG-- branch : dev
This commit is contained in:
@@ -186,9 +186,9 @@ namespace Orchard.Media.Controllers {
|
||||
}
|
||||
|
||||
var file = Request.Files[0];
|
||||
_mediaService.UploadMediaFile(viewModel.MediaPath, file);
|
||||
var publicUrl = _mediaService.UploadMediaFile(viewModel.MediaPath, file);
|
||||
|
||||
return Content(string.Format("<script type=\"text/javascript\">var result = {{ url: \"{0}\" }};</script>", Path.Combine(_mediaService.GetRootUrl(), string.Format("{0}/{1}", viewModel.MediaPath, Path.GetFileName(file.FileName)).Replace("//", "/")).Replace("\\", "/")));
|
||||
return Content(string.Format("<script type=\"text/javascript\">var result = {{ url: \"{0}\" }};</script>", publicUrl));
|
||||
}
|
||||
catch (Exception exception) {
|
||||
return Content(string.Format("<script type=\"text/javascript\">var result = {{ error: \"{0}\" }};</script>", T("ERROR: Uploading media file failed: {0}", exception.Message)));
|
||||
@@ -203,6 +203,7 @@ namespace Orchard.Media.Controllers {
|
||||
model.Size = size;
|
||||
model.FolderName = folderName;
|
||||
model.MediaPath = mediaPath;
|
||||
model.PublicUrl = _mediaService.GetPublicUrl(Path.Combine(mediaPath, name));
|
||||
return View(model);
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,7 @@ using Orchard.Media.Models;
|
||||
|
||||
namespace Orchard.Media.Services {
|
||||
public interface IMediaService : IDependency {
|
||||
string GetRootUrl();
|
||||
string GetPublicUrl(string path);
|
||||
IEnumerable<MediaFolder> GetMediaFolders(string path);
|
||||
IEnumerable<MediaFile> GetMediaFiles(string path);
|
||||
void CreateFolder(string path, string name);
|
||||
@@ -12,6 +12,6 @@ namespace Orchard.Media.Services {
|
||||
void RenameFolder(string path, string newName);
|
||||
void DeleteFile(string name, string folderName);
|
||||
void RenameFile(string name, string newName, string folderName);
|
||||
void UploadMediaFile(string folderName, HttpPostedFileBase postedFile);
|
||||
string UploadMediaFile(string folderName, HttpPostedFileBase postedFile);
|
||||
}
|
||||
}
|
@@ -13,38 +13,29 @@ namespace Orchard.Media.Services {
|
||||
[UsedImplicitly]
|
||||
public class MediaService : IMediaService {
|
||||
private readonly IStorageProvider _storageProvider;
|
||||
private readonly string _rootPath;
|
||||
private readonly string _rootUrl;
|
||||
|
||||
public MediaService (
|
||||
public MediaService(
|
||||
IStorageProvider storageProvider) {
|
||||
_storageProvider = storageProvider;
|
||||
_rootPath = HttpContext.Current.Server.MapPath("~/Media");
|
||||
_rootUrl = Path.Combine(HttpContext.Current.Request.ApplicationPath, "Media").Replace("\\", "/");
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public string GetRootUrl() {
|
||||
return _rootUrl;
|
||||
public string GetPublicUrl(string path) {
|
||||
return _storageProvider.GetPublicUrl(path);
|
||||
}
|
||||
|
||||
public IEnumerable<MediaFolder> GetMediaFolders(string path) {
|
||||
var mediaFolders = new List<MediaFolder>();
|
||||
var folders = (
|
||||
path == null ?
|
||||
_storageProvider.ListFolders(_rootPath) :
|
||||
_storageProvider.ListFolders(_rootPath + "\\" + path));
|
||||
var folders = _storageProvider.ListFolders(path);
|
||||
|
||||
foreach (var folder in folders) {
|
||||
var parentHierarchy = GetParentHierarchy(folder);
|
||||
var mediaPath = GetMediaPath(parentHierarchy, folder.GetName());
|
||||
var mediaFolder = new MediaFolder {
|
||||
Name = folder.GetName(),
|
||||
Size = folder.GetSize(),
|
||||
LastUpdated = folder.GetLastUpdated(),
|
||||
MediaPath = mediaPath
|
||||
MediaPath = folder.GetPath(),
|
||||
};
|
||||
mediaFolders.Add(mediaFolder);
|
||||
}
|
||||
@@ -54,13 +45,13 @@ namespace Orchard.Media.Services {
|
||||
public IEnumerable<MediaFile> GetMediaFiles(string path) {
|
||||
var mediaFiles = new List<MediaFile>();
|
||||
|
||||
var files = _storageProvider.ListFiles(_rootPath + "\\" + path);
|
||||
var files = _storageProvider.ListFiles(path);
|
||||
foreach (var file in files) {
|
||||
var mediaFile = new MediaFile {
|
||||
Name = file.GetName(),
|
||||
Size = file.GetSize(),
|
||||
LastUpdated = file.GetLastUpdated(),
|
||||
Type = file.GetFileType(),
|
||||
Type = file.GetFileType(),
|
||||
FolderName = path
|
||||
};
|
||||
mediaFiles.Add(mediaFile);
|
||||
@@ -71,44 +62,63 @@ namespace Orchard.Media.Services {
|
||||
//TODO: Use Path.Combine.
|
||||
public void CreateFolder(string mediaPath, string name) {
|
||||
if (String.IsNullOrEmpty(mediaPath)) {
|
||||
_storageProvider.CreateFolder(_rootPath + "\\" + name);
|
||||
_storageProvider.CreateFolder(name);
|
||||
return;
|
||||
}
|
||||
_storageProvider.CreateFolder(_rootPath + "\\" + mediaPath + "\\" + name);
|
||||
_storageProvider.CreateFolder(mediaPath + "\\" + name);
|
||||
}
|
||||
|
||||
public void DeleteFolder(string name) {
|
||||
_storageProvider.DeleteFolder(_rootPath + "\\" + name);
|
||||
_storageProvider.DeleteFolder(name);
|
||||
}
|
||||
|
||||
public void RenameFolder(string path, string newName) {
|
||||
var newPath = RenameFolderPath(path, newName);
|
||||
_storageProvider.RenameFolder(_rootPath + "\\" + path, _rootPath + "\\" + newPath);
|
||||
_storageProvider.RenameFolder(path, newPath);
|
||||
}
|
||||
|
||||
public void DeleteFile(string name, string folderName) {
|
||||
_storageProvider.DeleteFile(_rootPath + "\\" + folderName + "\\" + name);
|
||||
_storageProvider.DeleteFile(folderName + "\\" + name);
|
||||
}
|
||||
|
||||
public void RenameFile(string name, string newName, string folderName) {
|
||||
_storageProvider.RenameFile(_rootPath + "\\" + folderName + "\\" + name, _rootPath + "\\" + folderName + "\\" + newName);
|
||||
_storageProvider.RenameFile(folderName + "\\" + name, folderName + "\\" + newName);
|
||||
}
|
||||
|
||||
public void UploadMediaFile(string folderName, HttpPostedFileBase postedFile) {
|
||||
var targetFolder = HttpContext.Current.Server.MapPath("~/Media/" + folderName);
|
||||
public string UploadMediaFile(string folderName, HttpPostedFileBase postedFile) {
|
||||
|
||||
if (postedFile.FileName.EndsWith(".zip")) {
|
||||
UnzipMediaFileArchive(targetFolder, postedFile);
|
||||
UnzipMediaFileArchive(folderName, postedFile);
|
||||
// Don't save the zip file.
|
||||
return;
|
||||
return _storageProvider.GetPublicUrl(folderName);
|
||||
}
|
||||
|
||||
if (postedFile.ContentLength > 0) {
|
||||
string filePath = Path.Combine(targetFolder,
|
||||
Path.GetFileName(postedFile.FileName));
|
||||
postedFile.SaveAs(filePath);
|
||||
var filePath = Path.Combine(folderName, Path.GetFileName(postedFile.FileName));
|
||||
var inputStream = postedFile.InputStream;
|
||||
|
||||
SaveStream(filePath, inputStream);
|
||||
return _storageProvider.GetPublicUrl(filePath);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void UnzipMediaFileArchive(string targetFolder, HttpPostedFileBase postedFile) {
|
||||
private void SaveStream(string filePath, Stream inputStream) {
|
||||
var file = _storageProvider.CreateFile(filePath);
|
||||
var outputStream = file.OpenWrite();
|
||||
var buffer = new byte[8192];
|
||||
for (; ; ) {
|
||||
|
||||
var length = inputStream.Read(buffer, 0, buffer.Length);
|
||||
if (length <= 0)
|
||||
break;
|
||||
outputStream.Write(buffer, 0, length);
|
||||
}
|
||||
outputStream.Dispose();
|
||||
}
|
||||
|
||||
private void UnzipMediaFileArchive(string targetFolder, HttpPostedFileBase postedFile) {
|
||||
var postedFileLength = postedFile.ContentLength;
|
||||
var postedFileStream = postedFile.InputStream;
|
||||
var postedFileData = new byte[postedFileLength];
|
||||
@@ -124,46 +134,22 @@ namespace Orchard.Media.Services {
|
||||
// before the directories that contain them, so we create directories as soon as first
|
||||
// file below their path is encountered.
|
||||
while ((entry = fileInflater.GetNextEntry()) != null) {
|
||||
var directoryName = Path.GetDirectoryName(entry.Name);
|
||||
if (!Directory.Exists(Path.Combine(targetFolder, directoryName))) {
|
||||
Directory.CreateDirectory(Path.Combine(targetFolder, directoryName));
|
||||
}
|
||||
|
||||
if (!entry.IsDirectory && entry.Name.Length > 0) {
|
||||
var len = Convert.ToInt32(entry.Size);
|
||||
var extractedBytes = new byte[len];
|
||||
fileInflater.Read(extractedBytes, 0, len);
|
||||
File.WriteAllBytes(Path.Combine(targetFolder, entry.Name), extractedBytes);
|
||||
var entryName = Path.Combine(targetFolder, entry.Name);
|
||||
var directoryName = Path.GetDirectoryName(entryName);
|
||||
|
||||
try { _storageProvider.CreateFolder(directoryName); }
|
||||
catch {
|
||||
// no handling needed - this is to force the folder to exist if it doesn't
|
||||
}
|
||||
|
||||
SaveStream(entryName, fileInflater);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static List<string> GetParentHierarchy(IStorageFolder folder) {
|
||||
var parentHierarchy = new List<string>();
|
||||
do {
|
||||
IStorageFolder parentFolder = folder.GetParent();
|
||||
string parentName = parentFolder.GetName();
|
||||
if (String.Equals(parentName, "Media", StringComparison.OrdinalIgnoreCase)) {
|
||||
break;
|
||||
}
|
||||
parentHierarchy.Insert(0, parentName);
|
||||
folder = parentFolder;
|
||||
} while (true);
|
||||
|
||||
return parentHierarchy;
|
||||
}
|
||||
|
||||
private static string GetMediaPath(IEnumerable<string> parentHierarchy, string folderName) {
|
||||
var mediaPath = new StringBuilder();
|
||||
foreach (string parent in parentHierarchy) {
|
||||
mediaPath.Append(parent);
|
||||
mediaPath.Append("\\");
|
||||
}
|
||||
mediaPath.Append(folderName);
|
||||
return mediaPath.ToString();
|
||||
}
|
||||
|
||||
private static string RenameFolderPath(string path, string newName) {
|
||||
var lastIndex = path.LastIndexOf("\\");
|
||||
|
||||
|
@@ -14,5 +14,7 @@ namespace Orchard.Media.ViewModels {
|
||||
return MediaPath.Replace("\\", "/");
|
||||
}
|
||||
}
|
||||
|
||||
public string PublicUrl { get; set; }
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@
|
||||
<%= Html.ValidationSummary() %>
|
||||
<div class="primary">
|
||||
<div>
|
||||
<img src="<%=ResolveUrl("~/Media/" + Html.Encode(Model.RelativePath + "/" + Model.Name))%>" class="previewImage" alt="<%=Html.Encode(Model.Caption) %>" />
|
||||
<img src="<%=Model.PublicUrl%>" class="previewImage" alt="<%=Html.Encode(Model.Caption) %>" />
|
||||
</div>
|
||||
<fieldset>
|
||||
<%-- todo: make these real (including markup) --%>
|
||||
|
@@ -82,7 +82,7 @@ namespace Orchard.Setup.Controllers {
|
||||
"Orchard.Themes",
|
||||
"Orchard.MultiTenancy",
|
||||
"Orchard.Pages",
|
||||
"Orchard.Comments" };
|
||||
"Orchard.Comments"};
|
||||
|
||||
var setupContext = new SetupContext {
|
||||
SiteName = model.SiteName,
|
||||
|
Reference in New Issue
Block a user