Встроенный объект Windows — WinHttpRequest предоставляет достаточно удобную возможность взаимодействовать с сетью по протоколу HTTP.
В Интернете можно немало материалов рассказывающих о том, как использовать данный объект в 1С. Но вот материалов, рассказывающих о том, как с помощью этого объекта отправить на сервер файл — не так много, этот-то пробел и призвана восполнить данная статья.
Начнем с серверной части. У себя на локальном сервере я создал файл с названием «file.php» и вот таки содержимым:
1 2 3 | echo base64_decode(file_get_contents($_FILES['data']['tmp_name'])); ?> |
Единственное, что делает этот скрипт, это пытается вывести файл переданный ему в параметре «data».
Теперь рассмотрим код на стороне 1С:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); Boundary = "00000000000000"; ФайлДанных = "file.txt"; РазделительСтрок = Символ(10)+Символ(13); СтрокаBase64 = Base64Строка(Новый ДвоичныеДанные("C:\file.txt")); Зп = "--" + Boundary + " |Content-Disposition: form-data; data""; " + ФайлДанных + """ |Content-Type: application/xml;" + РазделительСтрок + РазделительСтрок + " |" + СтрокаBase64 + РазделительСтрок + " |--" + Boundary + "--"; WinHttp.Open("POST", "http://localhost/file.php", 0); WinHttp.SetRequestHeader("Content-Type","multipart/form-data;boundary=" + Boundary); WinHttp.SetRequestHeader("Content-Length", СтрДлина(Зп)); WinHttp.Send(Зп); Если WinHttp.Status = 200 Тогда Сообщить(WinHttp.ResponseText); КонецЕсли; |
Код прост и понятен, но все же кое-что пояснить нужно.
Параметр «Boundary» — это просто разделить он может быть практически любым, главное, чтобы не встречался в файле, подробнее можно прочесть тут.
Формат запроса (параметр «Зп») строг и с ним нужно быть внимательнее.
Как видите, ничего сверхсложного нет, но на мой взгляд, отправка файла стандартными средствами несколько проще.
На этом все, надеюсь данная статья кому-то помогла.
Возможно ли передать помимо файла ещё и какие-либо параметры. Можете привести пример. Заранее спасибо.
Здравствуйте. Также интересует вопрос по совместной передачи параметров и файла
В 9 строке пропущен РазделительСтрок после Boundary
Зп = «—» + Boundary + РазделительСтрок + «
В строке 17 надо внести изменения:
Было: «СтрДлина(Зп)»
Стало: «XMLСтрока(СтрДлина(Зп))»
Причина: Для данных больше килобайта неявное пребразование размера из числа в строку будет с дополнительным символом разделения на триады, что некорректно будет восприниматься сервером. «XMLСтрока» решает эту проблему.