![]() |
|
Скачать файл с http сервиса на 1С, вызов из Битрикса с авторизацией | ☑ | ||
---|---|---|---|---|
0
Oblako486
13.04.22
✎
13:46
|
Подойдет ли код ниже для этой задачи? или нужно делать через SOAPClient. В браузере если перейти по ссылке то pdf скачивается, предварительно браузер выдает окно с авторизацией.
$curl = curl_init(); $username = 'Администратор'; $password = 'ХХХХХ'; $url = 'http://domen.online/UT1/hs/CreatePDF/'; $fp = fopen("bill.pdf", "w"); curl_setopt($curl, CURLOPT_URL, '$url'); curl_setopt($curl, CURLOPT_USERPWD, $username . ":" . $password); curl_setopt($curl, CURLOPT_FILE, $fp); curl_setopt($curl, CURLOPT_USERAGENT, "Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.2.0"); $result = curl_exec($curl); curl_close($curl); этот код пока выдает ошибку: [Error] Call to undefined function pre() (0) /home/bitrix/ext_www/xxxx.ru/www/local/php_interface/include/cURL-polyfill.php:111 #0: Curl->execute() /home/bitrix/ext_www/xxxx.ru/www/local/php_interface/include/cURL-polyfill.php:22 |
|||
1
vde69
13.04.22
✎
13:56
|
переменная $curl будет передаваться в curl_setopt как значение или как ссылка?
|
|||
2
Oblako486
13.04.22
✎
13:59
|
(1) а как правильно?
|
|||
3
vde69
13.04.22
✎
14:07
|
(2) если параметр передается как значение, то фактически внутри процедуры ты получаешь копию и меняя ее ты меняешь только копию, по выходу из процедуры значение переменной переданное как параметр не изменится.
короче читай https://yandex.ru/search/?lr=213&text=php+передача+по+ссылке&fyandex=1 |
|||
4
Oblako486
13.04.22
✎
14:09
|
(3) чем отличается передача по ссылке или по значению мне понятна.
Но как это связано с текущим кодом? |
|||
5
vde69
13.04.22
✎
14:15
|
(4) покажи как у тебя описана процедура curl_setopt
|
|||
6
ololoraise
13.04.22
✎
14:21
|
(0) авторизация Basic?
У меня вот так работает: $user = "1"; $password = "1"; $base64=base64_encode("$user:$password"); $headers=Array(); array_push($headers,'Content-Type: application/x-www-form-urlencoded'); array_push($headers,'Authorization: Basic '.$base64); $curl=curl_init(); $uri=""; curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); curl_setopt($curl,CURLOPT_URL,$uri); curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'GET'); curl_setopt($curl,CURLOPT_HTTPHEADER,$headers); curl_setopt($curl,CURLOPT_HEADER,false); $response=curl_exec($curl); |
|||
7
Oblako486
13.04.22
✎
14:33
|
(5) ну по идеи вот так. Я её не модифицировал, это вроде стандартная https://www.php.net/manual/ru/function.curl-setopt.php
|
|||
8
Oblako486
13.04.22
✎
14:35
|
(6) Класс этот код прокатил, PDF попадает $response. Авторизация Basic.
Теперь остается вопрос. А как его правильно передать в браузер, чтобы пользователь увидел его на всю страницу? |
|||
9
ololoraise
13.04.22
✎
15:03
|
(8) что то наподобе:
$response=curl_exec($curl); $filename = "bill.pdf"; header('Content-type: application/pdf'); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: ' . strlen($response)); header('Accept-Ranges: bytes'); echo $response; |
|||
10
Oblako486
13.04.22
✎
16:36
|
(9) Вместо нормального pdf выводится текст, который ниже(середину вырезал).
%PDF-1.7 %‚„œ” 1 0 obj << /Filter /FlateDecode /Length 2 0 R /Length1 30148 /Length2 0 /Length3 0 >> stream xúÌΩ Ш'й&%Ѓe?rЭЂѕВ¬¦Ц іdмз?ecЏ‚-?qы&яѕ±яTЉэYќїўШясУяshџ? endstream endobj 32 0 obj 4733 endobj xref 0 33 0000000000 65535 f 0000000015 00000 n 0000019467 00000 n 0000019488 00000 n 0000019577 00000 n 0000019595 00000 n 0000019803 00000 n 0000020333 00000 n 0000020352 00000 n 0000020782 00000 n 0000020921 00000 n 0000040644 00000 n 0000040666 00000 n 0000040755 00000 n 0000040774 00000 n 0000040995 00000 n 0000041555 00000 n 0000041575 00000 n 0000042053 00000 n 0000042204 00000 n 0000063251 00000 n 0000063273 00000 n 0000063364 00000 n 0000063383 00000 n 0000063594 00000 n 0000064148 00000 n 0000064168 00000 n 0000064621 00000 n 0000064763 00000 n 0000064863 00000 n 0000064924 00000 n 0000065210 00000 n 0000070019 00000 n trailer << /Size 33 /Root 28 0 R /ID [ <1fe1a3f105174fd29809da28fb870969> <1fe1a3f105174fd29809da28fb870969> ] >> startxref 70040 %%EOF При этом сохранение pdf в файл на хостинге удается сделать. И сохраненный pdf, если его вручную открыть выглядит нормально. я бы предположил что нужно добавить такой header, но он добавлен. header('Content-Transfer-Encoding: binary'); |
|||
11
Oblako486
13.04.22
✎
19:15
|
(10) если посмотреть панель разработчика, там такой заголовк, странно что подменяется. content-type: text/html
|
|||
12
Юрий Лазаренко
13.04.22
✎
21:03
|
(10) А как ты хочешь на странице вывести PDF? Если хочется отобразить его на странице, то его сначала надо конвертировать в HTML, а ты получаешь двоичные данные, то есть, содержимое PDF-файла. Попробуй открыть обычный PDF текстовым редактором - ты в нем как раз увидишь текст из (10). Если хочешь отобразить в нормальном виде на странице, то на стороне 1С сначала конвертируй его в HTML и отдавай уже HTML.
|
|||
13
Oblako486
13.04.22
✎
21:37
|
(12) Не пойму, впринципе отказаться от pdf? Вместо pdf передавать html?
|
|||
14
Oblako486
13.04.22
✎
21:38
|
Мне удается сохранить из двоичных данных на сервере в нормальный Pdf. И этот файл вполне открывается вручную.
|
|||
15
Oblako486
13.04.22
✎
21:39
|
(14) но вот для браузера 10 пример из инета попробовал(даже начинать с того что файл pdf на сервере уже есть) и не работает.
|
|||
16
Oblako486
13.04.22
✎
21:43
|
(12) хочу открыть pdf в новой вклакде на весь экран
|
|||
17
Юрий Лазаренко
13.04.22
✎
22:25
|
(16) Если хочешь скачать как файл - тогда передаешь в виде двоичных данных с соответствующим заголовком, в 1С это делается так:
Ответ.Заголовки.Вставить("Content-Type","application/x-octet-stream"); Тогда при скачивании файла браузер сразу предлагает его сохранить. Если же PDF нужно открыть в новой вкладке браузера, то его необходимо конвертировать из формата PDF в формат HTML. Это можно сделать либо на стороне клиента (передать из 1С двоичные данные, в браузере эти данные принять, сконвертировать в HTML и показать на странице, но не уверен, что такие конвертеры для браузеров бывают), либо уже на стороне 1С сразу конвертировать и передавать браузеру готовый HTML. Браузер - это программа, которая берет размеченный текст и отбражает его. Но браузер понимает только язык разметки "HTML". PDF - это тоже по сути размеченный файл, но он размечен в формате PDF, а не HTML, поэтому браузер отображает просто его исходный код: кракозябры и всякие служебные символы. |
|||
18
Oblako486
13.04.22
✎
23:00
|
(17) c 1C файл успешно передается и сохраняется на сервере в нормальном виде. Здесь нет проблемы. (6) отлично работает.
Проблема на след. этапе. В этом же php нужно отдать файл в браузер. И нужен именно pdf. Браузеры вроде нормально их открывают без всякого html. В интернете примеры наподобие (9) но почему ни один не работает, даже те, которые берут pdf из файла на хостинге. |
|||
19
Oblako486
13.04.22
✎
23:02
|
например не работает такой пример, возвращается текст как в (10)
$filename = "bill.pdf"; header("Content-type: application/pdf"); header('Content-Disposition: inline; filename="' . $filename . '"'); readfile($filename); |
|||
20
Oblako486
13.04.22
✎
23:03
|
(19) идеально конечно сделать как в (9) вообще без сохранения файла.
|
|||
21
Oblako486
13.04.22
✎
23:06
|
(17) сам php файл нужен, чтобы скрыть адрес базы и авторизацию.
|
|||
22
Юрий Лазаренко
13.04.22
✎
23:17
|
(18) Я не буду утверждать, что уверен на 100%, но насколько помню, для того, чтобы браузер отображал PDF, в настройках необходимо установить соответствующий флажок. А если это так, то вариант передачи чистого pdf с заголовками
header("Content-type: application/pdf"); header('Content-Disposition: inline; filename="' . $filename . '"'); будет ненадежным. Я бы рассмотрел вариант конвертации pdf в html на стороне 1С. Хотя могу ошибаться. Но быстрое гугление не выдало рабочего варианта отображения PDF в браузере, которым можно рулить из PHP. |
|||
23
dreizehn
13.04.22
✎
23:40
|
(22) > рабочего варианта отображения PDF в браузере
https://stackoverflow.com/questions/12092633/pdf-js-rendering-a-pdf-file-using-a-base64-file-source-instead-of-url |
|||
24
ololoraise
14.04.22
✎
09:37
|
(10) Плагин для просмотра pdf в браузере есть?
|
|||
25
ololoraise
14.04.22
✎
09:52
|
+ (24) если плагина нет, тогда необходимо свой просмоторщик устанавливать на сайт, либо отдавать сразу для загрузки.
|
|||
26
Oblako486
14.04.22
✎
17:41
|
Разобрался. В итоге (6) и (9) отлично работает, как и хотелось без сохранения файла.
Проблема была в двух пробелах перед первым тегом php, при тестировании на стороннем сервере. А на сайте с битриксом подключал не тот пролог. Шапка выведенная перед самим выводом pdf, приводила как такому же эффекту, как два лишних пробела. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |