Как изменить путь к папке с изображениями по умолчанию в Orchard CMS
У меня установлена и работает Orchard CMS. При использовании WindowsLiveWriter для создания страниц он отображает изображения в папку, такую как / Media / Default / WindowsLiveWriter.
Например. /Media/Default/WindowsLiveWriter/testpost-title_12A72/sample_image_2.jpg
Я не хочу, чтобы в моих URL-адресах были разделы, относящиеся к технологиям, например "WindowsLiveWriter"
1) Как я могу настроить это в коде Orchard 1.7. Я хочу иметь структуру URL изображения, как
/Media/Default/2014/March/02/sample_image_2.jpg или /Media/Default/MyBlog/testpost-title_12A72/sample_image_2.jpg
2) Есть ли возможность в Live Writer указать папку, в которую должны быть сброшены изображения? Например, использовать дату как подпапку?
3) Могу ли я изменить прием метаданных, записанных в реальном времени, чтобы указать, где находится папка с моими изображениями?
Я искал во всей базе кода Orchard 1.7 строку WindowsLiveWriter (которая является частью URL), но не смог ее найти.
1 ответ
Измените файл \src\Orchard.Web\Modules\Orchard.MediaLibrary\Services\XmlRpcHandler.cs
следующее. Есть метод, который называется
private XRpcStruct MetaWeblogNewMediaObject(
string userName,
string password,
XRpcStruct file,
UrlHelper url){
}
Внутри этого измените имя файла в начале, прежде чем отправлять ответ в шаблон блога MS Word для живого писателя.
var name = file.Optional<string>("name");
name = Path.GetFileName(name);
name = "images/"+DateTime.Now.Year+"/"+DateTime.Now.Month+"/" + name;
Полный метод теперь выглядит как
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");
name = Path.GetFileName(name);
name = "images/"+DateTime.Now.Year+"/"+DateTime.Now.Month+"/" + 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"));
}