Выгрузка файла из 1с на веб сервер
Posted On 2019-04-24
Выгрузка файла из 1с на веб сервер, работает и на мобильной платформе
У нас должен быть установленный веб сервер с PHP
В каталог веб сервера передаётся файл send.txt. В параметре filename= задаётся имя файла и расширение файла, который выгрузится на веб сервер
Код 1с
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
_ПутьКФайлуЗапроса = "c:\Apache24\htdocs\send.txt";
Файл = Новый ЧтениеТекста(_ПутьКФайлуЗапроса, КодировкаТекста.ANSI);
// Файл = Новый ТекстовыйДокумент;
СодержимоеФайла = Файл.Прочитать();
// СодержимоеФайла = Файл.ПолучитьТекст();
ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";
КодироватьФайл = Истина;
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
//Определяем раздел двоичных данных
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
//Указываем имя файла для передачи
//На сервере оно появится в массиве $_FILES['datafile']['name']
ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""userfile""; filename=""" + _ПутьКФайлуЗапроса + """");
//Указываем тип передаваемых данных.
//С таким же успехом в Content-Type можно указать application/x-octet-stream
ФайлОтправки.ЗаписатьСтроку("Content-Type: application/x-zip-compressed" + Символы.ПС);
//Записываем кодированные двоичные данные
ФайлОтправки.ЗаписатьСтроку(СодержимоеФайла);
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
//Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы.
//Соответствует полю HTML-формы input type="submit" name="submit" value="Submit" /
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("1");
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
//Соответствует полю HTML-формы input type="checkbox" name="decode" value="decode" /
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""decode""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(?(КодироватьФайл, "1", "0"));
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
//Соответствует полю HTML-формы input type="text" name="some_field" value="Some text" /
ФайлОтправки.ЗаписатьСтроку("--" + Boundary);
ФайлОтправки.ЗаписатьСтроку("Content-disposition: form-data; name=""message""" + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("Передача файла из базы данных 1С Предприятия");
//Завершение сообщения для сервера
ФайлОтправки.ЗаписатьСтроку("--" + Boundary + "--");
ФайлОтправки.Закрыть();
ЗаголовокHTTP = Новый Соответствие();
//Обязательные поля заголовка
//Укажем формат данных Content-Type
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
//Укажем длину POST-запроса Content-Length
ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
//При необходимости зададим Referer, например таким образом
//СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
//СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref");
//ЗаголовокHTTP.Вставить("Referer", СерверИсточник);
НТТР = Новый HTTPСоединение("127.0.0.1" , 80);
ПутьКФайлуОтвета = "c:\Apache24\htdocs\report.html";
Попытка
HTTPОтвет = НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, "2upload.php", ПутьКФайлуОтвета, ЗаголовокHTTP);
//ТД = Новый ТекстовыйДокумент;
//ТД.Прочитать(_ПутьКФайлуОтвета);
//ТД.УдалитьСтроку(1);
//ТД.Записать(_ПутьКФайлуОтвета, КодировкаТекста.UTF8);
Исключение
Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки());
КонецПопытки;
В директории веб сервера должен лежать обработчик. В нашем случае это файл 2upload.php
Файл загружается в директорию uploads в корневом каталоге веб сервера
<?php
// Каталог, в который мы будем принимать файл:
$uploaddir = './uploads/';
$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
// Копируем файл из каталога для временного хранения файлов:
if (copy($_FILES['userfile']['tmp_name'], $uploadfile))
{
echo "<h3>Файл успешно загружен на сервер</h3>";
}
else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }
// Выводим информацию о загруженном файле:
echo "<h3>Информация о загруженном на сервер файле: </h3>";
echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['userfile']['name']."</b></p>";
echo "<p><b>Mime-тип загруженного файла: ".$_FILES['userfile']['type']."</b></p>";
echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['userfile']['size']."</b></p>";
echo "<p><b>Временное имя файла: ".$_FILES['userfile']['tmp_name']."</b></p>";
?>Ещё варианты обработчика
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
$uploaddir = "./uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "<P>Файл корректен и был успешно загружен.\n";
} else {
echo "<P>Возможная атака с помощью файловой загрузки!\n";
};
};
?><?php
//if($_FILES['userfile']['tmp_name'] != "")
//{
$uploaddir = "./uploads/";
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
copy($_FILES['userfile']['tmp_name'], $uploadfile);
//var_dump($_FILES);
//}
?>