Получить двоичные данные из типа страницы CMS.File - PullRequest
0 голосов
/ 09 января 2019

Мы используем веб-сайт ASP.NET MVC с Kentico 11. Когда файл загружается в CMS с использованием типа страницы CMS.File, нам необходимо получить его на стороне MVC.

Может быть, я могу сделать следующее?

var kntcoFile = FileProvider.GetFile(completeAlias, "en-US", "MySite").FirstOrDefault();

Если API нашел файл, как мне получить доступ к двоичным данным файла, чтобы я мог вернуть его в браузер?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Большое спасибо за указатели. Мне удалось получить вложение и вернуться в браузер, используя следующий подход. Ключ использовал GUID вложения, но имя документа.

Код нуждается в некоторой очистке, но просто делится на тот случай, если кому-то это нужно:

public ActionResult FilePage(string completeAlias)
{
    var kntcoFile = FileProvider.GetFile(completeAlias, "en-US", "MySite").FirstOrDefault();
    if (kntcoFile != null)
    {
        DocumentAttachment attachment = kntcoFile.AllAttachments.FirstOrDefault();
        if (attachment != null)
        {
            string kenticoSite = System.Configuration.ConfigurationManager.AppSettings["KenticoSite"];
            string fileUrl = string.Format("{0}getattachment/{1}/{2}", kenticoSite, attachment.AttachmentGUID, kntcoFile.DocumentName);
            byte[] fileBytes = null;

            using (WebClient wc = new WebClient())
            {
                fileBytes = wc.DownloadData(fileUrl);
            }
            return new FileContentResult(fileBytes, attachment.AttachmentMimeType);
        }
    }
    return new HttpNotFoundResult();
}
0 голосов
/ 10 января 2019

Я сделал что-то подобное для изображений, поэтому я изменил мой, чтобы, надеюсь, работать в вашем сценарии. Следует отметить, что AttachmentBinary не возвращается, если вы не вызовете перегрузку и не передадите значение true, чтобы вернуть его.

public ActionResult FilePage(string completeAlias)
{
    var kntcoFile = FileProvider.GetFile(completeAlias, "en-US", "MySite").FirstOrDefault();
    if (kntcoFile != null)
    {
        DocumentAttachment attachment = kntcoFile.AllAttachments.FirstOrDefault();
        if (attachment != null)
        {
            var attachmentBinary = AttachmentInfoProvider.GetAttachmentInfo(attachment.AttachmentID, true);
            return base.File(attachmentBinary.AttachmentBinary, attachment.AttachmentMimeType);
        }
    }


    EventLogProvider.LogInformation("GetFile", "NOTFOUND", "attachment Not Found" + completeAlias + " /");
    return null;
}
0 голосов
/ 09 января 2019

Даже если вы используете тип страницы файла - за кулисами вы все еще работаете с вложениями. Вы должны посмотреть на вложение API и AttachmentInfoProvider класс

так что если у вас есть объект страницы, вы можете сделать что-то вроде

DocumentAttachment da = page?.AllAttachments.FirstOrDefault();

или

   var attachment = AttachmentInfoProvider.GetAttachments()
       .WhereEquals("ColumnFromCMS_Attachment", "value")
       .FirstOrDefault();

Не уверен, какой из них более применим, но он должен дать вам идею ...

P.S. Вы также можете посмотреть проект kentico MVC на github и найти вложение

P.P.S. Проверьте также Работа с вложениями страниц в приложениях MVC

...