Гость
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebApi вернуть PDF. / 10 сообщений из 10, страница 1 из 1
20.08.2019, 02:33
    #39851387
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
Нашел на просторах интеренета такой вариант. Все работает, но файл приходит клиенту какой то не правильный, размер меняестя и видимо содержимое. в результате файл на клиенте не открывается. Хотя если посмотреть то это 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
20.08.2019, 02:34
    #39851388
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
оригинал
...
Рейтинг: 0 / 0
20.08.2019, 08:27
    #39851412
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
Код: 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
20.08.2019, 09:51
    #39851427
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
Код: c#
1.
2.
3.
4.
...
    response.Content = new StreamContent(fileStream);
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
...
...
Рейтинг: 0 / 0
20.08.2019, 10:04
    #39851431
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
из проекта (контроллер 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
20.08.2019, 19:06
    #39851817
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
Представленные мною код - правильный. Бинарник приходит целый. А вот функция обработки блоба на клеенте, которую я тоже нашел в инете. Кто как обрабатывает файл на клиенте???

Код: 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
20.08.2019, 19:14
    #39851819
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
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
20.08.2019, 19:23
    #39851820
Arpanx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
авторattachment
Я отдаю Content-Disposition: inline; filename="foo.html" и вот оно редко, но иногда бывает в браузере черный экран. Иногда Acrobat Reader какой-то эксепшен выбрасывает. Это стабильно происходит на каких-то машинах в каком-то старом IE. Но до конца понять проблему не могу.
Говорят что иногда "черный экран смерти". Один раз за всю жизнь ловил такое на своем ПК.

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



укажи правильный MIME
...
Рейтинг: 0 / 0
26.08.2019, 17:57
    #39853841
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebApi вернуть PDF.
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
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / WebApi вернуть PDF. / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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