Как правильно вернуть PDF внутри ответа JSON? - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужно вернуть два PDF файла внутри моего WebApi 2 ответа , на самом деле я делаю это, просто отправив файл PDF в виде Base64 string но мой вопрос был , если подход был верным или есть лучший способ сделать это ..

Вот мой конструктор, который возвращает Api:

public class DCW
{
    public string numdoc { get; set; }
    public string pdf { get; set; }
    public string pdf_regalo { get; set; }

    public string Base64(string path)
    {
        // Method to convert pdf to Base64
        byte[] bytes = File.ReadAllBytes(path);
        string file = Convert.ToBase64String(bytes);

        return file;
    }
}

А вот как выглядит мой controller:

  [Route("api/[controller]")]
    public class DriverController : Controller
    {
        [HttpPost]
        public DCW Post([FromBody]Scontrino scontrino)
        {

            DCW dcw = new DCW();
            string pdf = dcw.Base64("C:/users/imytyuk/Desktop/TEST/XXX01_731378.pdf");
            string pdf_regalo = dcw.Base64("C:/users/imytyuk/Desktop/TEST/XXX01_731378_regalo.pdf");

            dcw.numdoc = "5454835";
            dcw.pdf = pdf;
            dcw.pdf_regalo = pdf_regalo;

            return dcw;


        }

    }

На самом деле ответ таков:

{
    "numdoc": "5454835",
    "pdf": "XAGCTiT45cuco3YWQ6Ckz9e1//f0nr1NYb8f9crD26pyfKa4QBrqOsjf0d8vsaJmn1if6BbiRtHkKZW5kc3RyZWFtCmVuZG2QJ4G83q5nqMbS1sNHnZsr7uBPMd8Bkdbr4AplbmRzdHJlYW0KZW5kb2JqCjE5IDAgb2JqCjc3MAplbmRvYmoKMjAgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWFJlZi9XWzEgMADSDSAeM2RTM0MzBCOTZCRTA0QUM4OTNFREJFNT5dL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA1L1ByZWRpY3RvciAxMj4+L0xlbmd0aCA5NCAgICAgICAgPj4Kc3RyZWFtCnicNcuxDYAwDETR8wVFoUdiCCqGYhMGYAyo2IAx2CVEwdgImqfTl00AqiSStLSN/Bo+NZxe6ghQkE1Ng4lyeKn9d6nUZsNNcPV+7Yh/jxMKIbN/SeeGxYXtB9mvFuAKZW5kc3RyZWFtCmVuZG9iagpzdGFydHhyZWYKMjk4NQolJUVPRgo=",
    "pdf_regalo": "JV9IKNiAwIG9iago8PC9MZW5ndGggNSAwIFIvRmlsdGVyL0ZsYXRlRGVjb2RlPj4Kc3RyZWFtCniclVZdb9pIFFWcAWwTYQOxIRCSaQutHWA6ng+DSDvmyXt7hPW+3DqolUXvbv77WDiSk2TIWQPB/n3HOvz9zxd/uXjf3xN4ojhjf/2BRv/rAZTwmLGU4iQTiF+a/2Y3BhXKIwSoJWmNDAaBsXHbNjIit77oZfNp/sXzf2n/b3OjKmiFIMqzR+JbvKtj3HdbItMvthxNLAGAyvPeT7o/HN5Maf3o7OkEYxoTBWKnkl7MH50sABP5aSi5SQ8lZM74DHNwcGAJZqQ6KBaR5WysiALH5wsRNl2uVy5MNzCyKt7A5wRqcMJ1fdr8CBIJhERyUn0IzRrRUEUNNrVGrlkCfrcj+5qXXvCmB5rgBoT0kH/4KdqRmCESr/UyKi8PJrTOU95Kh0N9IkXBK36bIu+wtiDq++lN1tTD/uz/njsuN5b611dUpJBF5Q63MF8Ma87/KBMpGd9N8zCXs+ly7XjuBE4epltWeFm5D6gnc+3D866ztxML0Rz3TXAzS4S6rwHm7MrUkNkzbmL1itY7+VHJgvcxkQ1wp3IVAPd7LD8Kjjnzx9Tfcjzy7MsZrOQnuxQOhFO6IvgQ0icRt9nYRYIsi76ZucDuh/Khb/wJ9PR9DZuqrkGL1LrFUL+ZODPBznhwRUmcfn//Lv9yDHHXyj+mt8HsrDeE3xgls/lXdCIYhWY0IeJCkzG2rAcFRWHfyfyZaCnsgSKnwCKKrAQqgkEnOCFfV6U7gZaSvdA8RNAUQXmSg+A/wMR9mz2CmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iago5MDUKZW5kb2JqCjkgMCBvYmoKPDwvVGl0bGUgKERPQ1VNRU5UTyBDT01NRVJDSUFMRSBESSBWRU5ESVRBICRSZXZpc2lvbjogMS4wICQpCi9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA0MDcxMTM0NTQrMDInMDAnKQovUHJvZHVjZXIgKFBERmxpYiBQZXJzb25hbGl6YXRpb24gU2VydmVyIDkuMC40IFwoSkRLIDEuNi9MaW51eC14ODZfNjRcKSkKPj4KZW5kb2JqCjEyIDAgb2J="
}

1 Ответ

1 голос
/ 07 апреля 2020

Короткий ответ - нет. Это простой git способ передачи файлов, но есть несколько минусов:

  1. Кодировка Base64 увеличивает издержки в пространстве из-за своей текстовой природы
  2. В вашем подходе сервер должен загружать все файл в память и выполнить фактическое преобразование в base64, чего можно избежать
  3. В вашем подходе вы заставляете браузер загружать весь файл в память (фактически он должен сохранять весь запрос), когда клиент получает файл в кодировке base64, Единственный способ создать ссылку на скачивание - это манипулировать заданной строкой в ​​кодировке base64, например, href="data:...;base64,asdasd или с помощью браузера API.

Чтобы исправить это, я рекомендую вам создавать отдельные методы GET в вашем контроллере для каждого файлы и переписать оригинальный метод так, чтобы он предоставил необходимую информацию для построения ссылки для загрузки в браузере на вновь добавленные методы, это может быть просто относительная ссылка на метод контроллера вместо содержимого файла. В методе GET вы также предполагаете использовать Controller.File(Stream, String, String) и путь там FileStream к целевому файлу.

Конечно, могут быть разные случаи. И иногда необходимо загрузить весь файл как base64 в клиентский браузер, например: обрезка изображений, цифровые подписи. Но если есть возможность избежать этого, то этого следует избегать.

...