using System; using System.Collections.Generic; using System.IO; using System.Web; using System.Web.Mvc; using Orchard.Core.Contents.Controllers; using Orchard.Localization; using Orchard.Media.Models; using Orchard.Media.Services; using Orchard.Media.ViewModels; using Orchard.UI.Notify; namespace Orchard.Media.Controllers { [ValidateInput(false)] public class AdminController : Controller { private readonly IMediaService _mediaService; public AdminController(IOrchardServices services, IMediaService mediaService) { Services = services; _mediaService = mediaService; T = NullLocalizer.Instance; } public IOrchardServices Services { get; set;} public Localizer T { get; set; } public ActionResult Index() { // Root media folders IEnumerable mediaFolders = _mediaService.GetMediaFolders(null); var model = new MediaFolderIndexViewModel { MediaFolders = mediaFolders }; return View(model); } [HttpPost] public ActionResult Index(FormCollection input) { try { foreach (string key in input.Keys) { if (key.StartsWith("Checkbox.") && input[key] == "true") { string folderName = key.Substring("Checkbox.".Length); _mediaService.DeleteFolder(folderName); } } return RedirectToAction("Index"); } catch (Exception exception) { Services.Notifier.Error(T("Deleting Folder failed: {0}", exception.Message)); return View(); } } public ActionResult Create(string mediaPath) { return View(new MediaFolderCreateViewModel { MediaPath = mediaPath }); } [HttpPost] public ActionResult Create() { if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't create media folder"))) return new HttpUnauthorizedResult(); var viewModel = new MediaFolderCreateViewModel(); try { UpdateModel(viewModel); _mediaService.CreateFolder(viewModel.MediaPath, viewModel.Name); Services.Notifier.Information(T("Media folder created")); return RedirectToAction("Index"); } catch (Exception exception) { Services.Notifier.Error(T("Creating Folder failed: {0}", exception.Message)); return View(viewModel); } } public ActionResult Edit(string name, string mediaPath) { IEnumerable mediaFiles = _mediaService.GetMediaFiles(mediaPath); IEnumerable mediaFolders = _mediaService.GetMediaFolders(mediaPath); var model = new MediaFolderEditViewModel { FolderName = name, MediaFiles = mediaFiles, MediaFolders = mediaFolders, MediaPath = mediaPath }; return View(model); } [HttpPost] public ActionResult Edit(FormCollection input) { try { foreach (string key in input.Keys) { if (key.StartsWith("Checkbox.File.") && input[key] == "true") { string fileName = key.Substring("Checkbox.File.".Length); string folderName = input[fileName]; if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't delete media file"))) return new HttpUnauthorizedResult(); _mediaService.DeleteFile(fileName, folderName); Services.Notifier.Information(T("Media file deleted")); } else if (key.StartsWith("Checkbox.Folder.") && input[key] == "true") { string folderName = key.Substring("Checkbox.Folder.".Length); string folderPath = input[folderName]; if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't delete media folder"))) return new HttpUnauthorizedResult(); _mediaService.DeleteFolder(folderPath); Services.Notifier.Information(T("Media folder deleted")); } } return RedirectToAction("Index"); } catch (Exception exception) { Services.Notifier.Error(T("Deleting failed: {0}", exception.Message)); return View(); } } public ActionResult EditProperties(string folderName, string mediaPath) { var model = new MediaFolderEditPropertiesViewModel { Name = folderName, MediaPath = mediaPath }; return View(model); } [HttpPost, ActionName("EditProperties")] [FormValueRequired("submit.Delete")] public ActionResult EditPropertiesDeletePOST() { if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't delete media folder"))) return new HttpUnauthorizedResult(); var viewModel = new MediaFolderEditPropertiesViewModel(); try { UpdateModel(viewModel); _mediaService.DeleteFolder(viewModel.MediaPath); Services.Notifier.Information(T("Media folder deleted")); return RedirectToAction("Index"); } catch (Exception exception) { Services.Notifier.Error(T("Deleting media folder failed: {0}", exception.Message)); return View(viewModel); } } [HttpPost, ActionName("EditProperties")] [FormValueRequired("submit.Save")] public ActionResult EditProperties() { if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't rename media folder"))) return new HttpUnauthorizedResult(); var viewModel = new MediaFolderEditPropertiesViewModel(); try { UpdateModel(viewModel); _mediaService.RenameFolder(viewModel.MediaPath, viewModel.Name); Services.Notifier.Information(T("Media folder properties modified")); return RedirectToAction("Index"); } catch (Exception exception) { Services.Notifier.Error(T("Modifying media folder properties failed: {0}", exception.Message)); return View(viewModel); } } public ActionResult Add(string folderName, string mediaPath) { var model = new MediaItemAddViewModel { FolderName = folderName, MediaPath = mediaPath }; return View(model); } [HttpPost] public ActionResult Add() { if (!Services.Authorizer.Authorize(Permissions.UploadMediaFiles, T("Couldn't upload media file"))) return new HttpUnauthorizedResult(); var viewModel = new MediaItemAddViewModel(); try { UpdateModel(viewModel); if(String.IsNullOrWhiteSpace(Request.Files[0].FileName)) { ModelState.AddModelError("File", T("Select a file to upload").ToString()); } if (!ModelState.IsValid) return View(viewModel); // first validate them all foreach (string fileName in Request.Files) { HttpPostedFileBase file = Request.Files[fileName]; if (!_mediaService.FileAllowed(file)) { ModelState.AddModelError("File", T("That file type is not allowed.").ToString()); return View(viewModel); } } // then save them foreach (string fileName in Request.Files) { HttpPostedFileBase file = Request.Files[fileName]; _mediaService.UploadMediaFile(viewModel.MediaPath, file); } Services.Notifier.Information(T("Media file(s) uploaded")); return RedirectToAction("Edit", new { name = viewModel.FolderName, mediaPath = viewModel.MediaPath }); } catch (Exception exception) { Services.Notifier.Error(T("Uploading media file failed: {0}", exception.Message)); return View(viewModel); } } [HttpPost] public ContentResult AddFromClient() { if (!Services.Authorizer.Authorize(Permissions.UploadMediaFiles)) return Content(string.Format("", T("ERROR: You don't have permission to upload media files"))); var viewModel = new MediaItemAddViewModel(); try { UpdateModel(viewModel); if (Request.Files.Count < 1 || Request.Files[0].ContentLength == 0) return Content(string.Format("", T("HEY: You didn't give me a file to upload"))); try { _mediaService.GetMediaFiles(viewModel.MediaPath); } catch //media api needs a little work, like everything else of course ;) <- ;) == my stuff included. to clarify I need a way to know if the path exists or have UploadMediaFile create paths as necessary but there isn't the time to hook that up in the near future { _mediaService.CreateFolder(viewModel.MediaPath, ""); } var file = Request.Files[0]; var publicUrl = _mediaService.UploadMediaFile(viewModel.MediaPath, file); return Content(string.Format("", publicUrl)); } catch (Exception exception) { return Content(string.Format("", T("ERROR: Uploading media file failed: {0}", exception.Message))); } } public ActionResult EditMedia(string name, DateTime lastUpdated, long size, string folderName, string mediaPath) { var model = new MediaItemEditViewModel(); model.Name = name; // todo: reimplement //model.Caption = caption ?? String.Empty; model.LastUpdated = lastUpdated; model.Size = size; model.FolderName = folderName; model.MediaPath = mediaPath; model.PublicUrl = _mediaService.GetPublicUrl(Path.Combine(mediaPath, name)); return View(model); } [HttpPost, ActionName("EditMedia")] [FormValueRequired("submit.Delete")] public ActionResult EditMediaDeletePOST(FormCollection input) { if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't delete media file"))) return new HttpUnauthorizedResult(); var viewModel = new MediaItemEditViewModel(); try { UpdateModel(viewModel); _mediaService.DeleteFile(viewModel.Name, viewModel.MediaPath); Services.Notifier.Information(T("Media deleted")); return RedirectToAction("Edit", new { name = viewModel.FolderName, mediaPath = viewModel.MediaPath }); } catch (Exception exception) { Services.Notifier.Error(T("Removing media file failed: {0}", exception.Message)); return View(viewModel); } } [HttpPost, ActionName("EditMedia")] [FormValueRequired("submit.Save")] public ActionResult EditMedia(FormCollection input) { if (!Services.Authorizer.Authorize(Permissions.ManageMediaFiles, T("Couldn't modify media file"))) return new HttpUnauthorizedResult(); var viewModel = new MediaItemEditViewModel(); try { UpdateModel(viewModel); string viewModelName = viewModel.Name; // Rename if (!String.Equals(viewModel.Name, input["NewName"], StringComparison.OrdinalIgnoreCase)) { _mediaService.RenameFile(viewModel.Name, input["NewName"], viewModel.MediaPath); viewModelName = input["NewName"]; } Services.Notifier.Information(T("Media information updated")); return RedirectToAction("EditMedia", new { name = viewModelName, caption = viewModel.Caption, lastUpdated = viewModel.LastUpdated, size = viewModel.Size, folderName = viewModel.FolderName, mediaPath = viewModel.MediaPath }); } catch (Exception exception) { Services.Notifier.Error(T("Editing media file failed: {0}", exception.Message)); return View(viewModel); } } } }