Передача файлов через HTTP-протокол — частая задача при интеграции 1С с внешними API. Основная сложность заключается в строгом соблюдении протокола multipart/form-data. Если сервер присылает в ответ исходный код PHP-файла вместо сообщения об успехе, это верный признак того, что запрос сформирован некорректно и сервер не смог его распознать.
Рассмотрим, почему стандартные методы могут приводить к сбоям:
CRLF (символы Символы.ВК + Символы.ПС). Использование других переносов строк приведет к тому, что парсер сервера проигнорирует содержимое.Content-Length при использовании метода УстановитьТелоИзДвоичныхДанных. Ручное добавление этого заголовка часто создает конфликт.Content-Disposition делает невозможным извлечение файла на стороне сервера.//) в пути к PHP-скрипту заставляет сервер отдавать файл как текст, а не выполнять его.Чтобы успешно передать файл, выполним следующие шаги:
КодировкаТекста.UTF8 для обеспечения совместимости.boundary (разделитель), который должен быть уникальным.multipart-запросе стоят необходимые пустые строки.Ниже представлен пример, который учитывает исправленные ошибки и рекомендации:
Разделитель = "----" + СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
Тело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, , Символы.ВК + Символы.ПС, "");
// Начало блока данных
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""fileToSend""; filename=""" + ИмяФайла + """");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
ЗаписьДанных.ЗаписатьСтроку(""); // Пустая строка обязательна!
// Запись двоичных данных
ДанныеФайла = Новый ДвоичныеДанные(ПолноеИмяФайла);
ЗаписьДанных.Записать(ДанныеФайла);
ЗаписьДанных.ЗаписатьСтроку("");
// Закрытие блока
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();
ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();
// Настройка HTTP-соединения
ssl = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение("xxxxxxxa.ru", , , , , , ssl);
HTTPЗапрос = Новый HTTPЗапрос("/xxxxxxxxxx/sendMessage.php");
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Разделитель);
ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
НашОтвет = ОтветHTTP.ПолучитьТелоКакСтроку();
Если после внесения изменений вы все еще получаете ошибку или код страницы, проанализируйте следующие аспекты:
multipart-поток отдельными секциями, аналогично блоку с файлом.Postman запрос работает, значит, проблема скрыта в нюансах реализации 1С.Помните, что сервер может возвращать ошибку, если у вас нет доступа к ресурсу с текущего IP-адреса, даже если структура запроса идеальна. Всегда уточняйте у администратора API требования к заголовкам и правам доступа.