mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-08-01 19:24:00 +08:00
parent
e42644a39b
commit
ee526030f8
@ -156,6 +156,7 @@
|
||||
<Compile Include="Services\IMediaLibraryService.cs" />
|
||||
<Compile Include="Services\MediaLibraryService.cs" />
|
||||
<Compile Include="Services\Shapes.cs" />
|
||||
<Compile Include="Services\XmlRpcHandler.cs" />
|
||||
<Compile Include="Settings\MediaLibraryPickerFieldEditorEvents.cs" />
|
||||
<Compile Include="Settings\MediaLibraryPickerFieldSettings.cs" />
|
||||
<Compile Include="ViewModels\MediaLibraryPickerFieldViewModel.cs" />
|
||||
|
@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Routing;
|
||||
using System.Xml.Linq;
|
||||
using Orchard.Core.XmlRpc;
|
||||
using Orchard.Core.XmlRpc.Models;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Mvc.Extensions;
|
||||
using Orchard.Security;
|
||||
|
||||
namespace Orchard.MediaLibrary.Services {
|
||||
public class XmlRpcHandler : IXmlRpcHandler {
|
||||
private readonly IMembershipService _membershipService;
|
||||
private readonly IAuthorizationService _authorizationService;
|
||||
private readonly IMediaLibraryService _mediaLibraryService;
|
||||
private readonly RouteCollection _routeCollection;
|
||||
|
||||
public XmlRpcHandler(
|
||||
IMembershipService membershipService,
|
||||
IAuthorizationService authorizationService,
|
||||
IMediaLibraryService mediaLibraryService,
|
||||
RouteCollection routeCollection) {
|
||||
_membershipService = membershipService;
|
||||
_authorizationService = authorizationService;
|
||||
_mediaLibraryService = mediaLibraryService;
|
||||
_routeCollection = routeCollection;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
|
||||
public void SetCapabilities(XElement options) {
|
||||
const string manifestUri = "http://schemas.microsoft.com/wlw/manifest/weblog";
|
||||
options.SetElementValue(XName.Get("supportsFileUpload", manifestUri), "Yes");
|
||||
}
|
||||
|
||||
public void Process(XmlRpcContext context) {
|
||||
var urlHelper = new UrlHelper(context.ControllerContext.RequestContext, _routeCollection);
|
||||
|
||||
if (context.Request.MethodName == "metaWeblog.newMediaObject") {
|
||||
var result = MetaWeblogNewMediaObject(
|
||||
Convert.ToString(context.Request.Params[1].Value),
|
||||
Convert.ToString(context.Request.Params[2].Value),
|
||||
(XRpcStruct)context.Request.Params[3].Value,
|
||||
urlHelper);
|
||||
context.Response = new XRpcMethodResponse().Add(result);
|
||||
}
|
||||
}
|
||||
|
||||
private XRpcStruct MetaWeblogNewMediaObject(
|
||||
string userName,
|
||||
string password,
|
||||
XRpcStruct file,
|
||||
UrlHelper url) {
|
||||
|
||||
var user = _membershipService.ValidateUser(userName, password);
|
||||
if (!_authorizationService.TryCheckAccess(Permissions.ManageMediaContent, user, null)) {
|
||||
throw new OrchardCoreException(T("Access denied"));
|
||||
}
|
||||
|
||||
var name = file.Optional<string>("name");
|
||||
var bits = file.Optional<byte[]>("bits");
|
||||
|
||||
string directoryName = Path.GetDirectoryName(name);
|
||||
if (string.IsNullOrWhiteSpace(directoryName)) { // Some clients only pass in a name path that does not contain a directory component.
|
||||
directoryName = "media";
|
||||
}
|
||||
|
||||
try {
|
||||
// delete the file if it already exists, e.g. an updated image in a blog post
|
||||
// it's safe to delete the file as each content item gets a specific folder
|
||||
_mediaLibraryService.DeleteFile(directoryName, Path.GetFileName(name));
|
||||
}
|
||||
catch {
|
||||
// current way to delete a file if it exists
|
||||
}
|
||||
|
||||
string publicUrl = _mediaLibraryService.UploadMediaFile(directoryName, Path.GetFileName(name), bits);
|
||||
_mediaLibraryService.ImportMedia(directoryName, Path.GetFileName(name));
|
||||
return new XRpcStruct() // Some clients require all optional attributes to be declared Wordpress responds in this way as well.
|
||||
.Set("file", publicUrl)
|
||||
.Set("url", url.MakeAbsolute(publicUrl))
|
||||
.Set("type", file.Optional<string>("type"));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user