powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebApi вернуть PDF.
10 сообщений из 10, страница 1 из 1
WebApi вернуть PDF.
    #39851387
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел на просторах интеренета такой вариант. Все работает, но файл приходит клиенту какой то не правильный, размер меняестя и видимо содержимое. в результате файл на клиенте не открывается. Хотя если посмотреть то это PDF, но бинарные данные не совпадают с оригиналом. Гдето идет конверсия. Вопрос: где????

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
        // GET: api/MdlList
        public HttpResponseMessage GetPdf(string station, DateTime startDate, DateTime endDate, string FISponsor1, string MLPPlanning, string Scope, string FI2Sponsor2, DateTime Date1, string MPLPlanningEngineer, DateTime Date2)
        {
            MdlSignofReport rep;
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);

            var Data = _db.MasterDigLists
                            .Where(p => p.Date >= startDate && p.Date <= endDate && p.Terminal == station)
                            .OrderBy(p => p.DigID)
                            .ToList();

            rep = new MdlSignofReport();

            var buffer = rep.CreatePdf(station, FISponsor1, MLPPlanning, Data.Count(),  Scope, FI2Sponsor2, Date1, MPLPlanningEngineer, Date2);
            int contentLength = buffer.Count();

            response.Content = new StreamContent(new MemoryStream(buffer));
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            response.Content.Headers.ContentLength = contentLength;
            ContentDispositionHeaderValue contentDisposition = null;
            if (ContentDispositionHeaderValue.TryParse("inline; filename=file.pdf", out contentDisposition))
            {
                response.Content.Headers.ContentDisposition = contentDisposition;
            }

            return response;
        }

...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851388
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оригинал
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851412
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    /// <summary>
    /// Хранение файла
    /// </summary>
    public struct TransferFile
    {
        /// <summary>
        /// Имя файла
        /// </summary>
        public string  FileName { get; }

        public byte[] Bytes { get;  }

        public TransferFile(string fileName, byte[] bytes)
        {
            FileName = fileName;
            Bytes = bytes;
        }

    }





Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
 /// <summary>
        /// Получить файлы из хранилища
        /// </summary>
        /// <param name="id">id, по которому нужно отобрать файлы</param>
        /// <returns>Список файлов</returns>
        public  async Task<IEnumerable<TransferFile>> GetFilesAsync(Guid id)
        {
            var fileList = new List<TransferFile>();
            try
            {
                using (SqlConnection con = new SqlConnection(mdbString))
                {
                    if (con.State != ConnectionState.Open)
                        await con.OpenAsync();
                    try
                    {
                        using (SqlCommand cmd = new SqlCommand("GetFile", con))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;

                            SqlParameter masterId = cmd.Parameters.Add("@id", SqlDbType.UniqueIdentifier);
                            masterId.Value = id;

                            using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
                            {
                                if (reader.HasRows)
                                {
                                    while (await reader.ReadAsync())
                                    {
                                        fileList.Add(new TransferFile((string)reader["FileName"], (byte[])reader["File"]));
                                    }
                                }
                                else
                                {
                                    return fileList;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        return fileList;
                    }
                }

            }
            catch (Exception)
            {
                return fileList;
            }
            return fileList;
        }





Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
   /// <summary>
        /// Отправка файла клиенту
        /// </summary>
        /// <param name="id">Идентификатор файла</param>
        /// <returns></returns>
        public async Task<IActionResult> GetFile(Guid id)
        {
            var fileList = await mrepository.GetFilesAsync(id);

            if (fileList.Count()>1)
            {
                //несколько файлов-упаковываем в архив
                    return new FileContentResult(await mZiper.CompressAsync(fileList), "application/zip") { FileDownloadName = "Files.zip" };               
            }
            else
            {
                var fl = fileList.FirstOrDefault();
                return File(fl.Bytes, "application/octet-stream", fl.FileName);
            }
        }


Я этим методом возвращал в браузер команду на скачивания файла, правда в архиве. Попробуй может под себя может переделаешь.
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851427
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
...
    response.Content = new StreamContent(fileStream);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
...
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851431
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из проекта (контроллер webapi)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
            fileName = HttpUtility.UrlPathEncode(fileName);
            var c = new MemoryStream();
            file.Stream.CopyTo(c);
            byte[] a = c.GetBuffer();
            var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(a) }; //передаём через ByteArrayContent() для правильного вывода файла клиенту, иначе получем corrupt-файл для Word/pdf
            if (contentType == MediaTypeNames.Application.Pdf)
            {
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
            }
            response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
            response.Content.Headers.ContentLength = file.ContentLength;
            response.Headers.TransferEncodingChunked = false;
            return response;
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851817
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представленные мною код - правильный. Бинарник приходит целый. А вот функция обработки блоба на клеенте, которую я тоже нашел в инете. Кто как обрабатывает файл на клиенте???

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
        $http({
            type: "POST",
            url: "api/Mdl",
            params: { station: station, startDate: startDate, endDate: endDate, FISponsor1: FISponsor1, MLPPlanning: MLPPlanning, Scope: Scope, FI2Sponsor2: FI2Sponsor2, Date1: Date1, MPLPlanningEngineer: MPLPlanningEngineer, Date2: Date2 }
        }).then(function success(response) {
            showFile(response.data);
        }, function error(response) {
            $scope.errorMessage = "Error: " + response.statusText;
        });

    });

    var showFile = function (blob) {
        // It is necessary to create a new blob object with mime-type explicitly set
        // otherwise only Chrome works like it should
        var newBlob = new Blob([blob], { type: "application/pdf" });

        // IE doesn't allow using a blob object directly as link href
        // instead it is necessary to use msSaveOrOpenBlob
        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
            window.navigator.msSaveOrOpenBlob(newBlob);
            return;
        }

        // For other browsers: 
        // Create a link pointing to the ObjectURL containing the blob.
        const data = window.URL.createObjectURL(newBlob);
        var link = document.createElement('a');
        link.href = data;
        link.download = "file.pdf";
        link.click();
        setTimeout(function () {
            // For Firefox it is necessary to delay revoking the ObjectURL
            window.URL.revokeObjectURL(data);
        }, 100);
    };

...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851819
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
А вот и решение подвезли )))))


        $http({
            type: "POST",
            url: "api/Mdl",
            responseType: "arraybuffer",
            params: { station: station, startDate: startDate, endDate: endDate, FISponsor1: FISponsor1, MLPPlanning: MLPPlanning, Scope: Scope, FI2Sponsor2: FI2Sponsor2, Date1: Date1, MPLPlanningEngineer: MPLPlanningEngineer, Date2: Date2 }
        }).then(function success(response) {
            showFile(response.data);
        }, function error(response) {
            $scope.errorMessage = "Error: " + response.statusText;
        });
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39851820
Фотография Arpanx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторattachment
Я отдаю Content-Disposition: inline; filename="foo.html" и вот оно редко, но иногда бывает в браузере черный экран. Иногда Acrobat Reader какой-то эксепшен выбрасывает. Это стабильно происходит на каких-то машинах в каком-то старом IE. Но до конца понять проблему не могу.
Говорят что иногда "черный экран смерти". Один раз за всю жизнь ловил такое на своем ПК.

http://test.greenbytes.de/tech/tc2231/#inlwithasciifilenamepdf
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39853711
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Код: c#
1.
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");



укажи правильный MIME
...
Рейтинг: 0 / 0
WebApi вернуть PDF.
    #39853841
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationRelic Hunter
Код: c#
1.
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");



укажи правильный MIME

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$http({
            type: "POST",
            url: "api/Mdl",
            responseType: "arraybuffer",
            params: { station: station, startDate: startDate, endDate: endDate, FISponsor1: FISponsor1, MLPPlanning: MLPPlanning, Scope: Scope, FI2Sponsor2: FI2Sponsor2, Date1: Date1, MPLPlanningEngineer: MPLPlanningEngineer, Date2: Date2 }
        }).then(function success(response) {
            showFile(response.data);
        }, function error(response) {
            $scope.errorMessage = "Error: " + response.statusText;
        });



Я же выделил решение красным цветом. А на mime-type пофиг. Не работало не с одним ни с другим.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebApi вернуть PDF.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]