Отправка массива файлов через Libcurl

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Отправка массива файлов через Libcurl

Сообщение harry »

Возникла необходимость отправить через Libcurl в одном запросе набор полей и список файлов (картинок). Какой правильный путь решения данной задачи ?
Возможно ли из Clarion использовать такую конструкцию с передачей массива ?

Код: Выделить всё

curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures", CURLFORM_ARRAY, forms, CURLFORM_END)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Посмотрите класс TCurlHttpClass и вот эти методы:

Код: Выделить всё

FormAdd                         PROCEDURE(STRING pFieldName, STRING pContents), CURLFORMcode, PROC
FormAddFile                     PROCEDURE(STRING pFieldName, STRING pFileName, <STRING pContentType>), CURLFORMcode, PROC !ContentType like 'image/jpeg'
FormPost                        PROCEDURE(STRING pUrl, <STRING pResponseFile>, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
FormPost                        PROCEDURE(STRING pUrl, *IDynStr pDynStr, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
FormPostStr                     PROCEDURE(STRING pUrl, <*STRING pResponseBuf>, <curl::ProgressDataProcType xferproc>), CURLcode, PROC
FormFree                        PROCEDURE()
С уважением, ДП
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Отправка массива файлов через Libcurl

Сообщение harry »

Перечисленные вами методы смотрел. реализую через FormAddFile и FormPost.
В заголовке задаю Content-type: multipart/form-data
Сначала цикл по простым текстовым полям

Код: Выделить всё

    Loop Indx=1 to Records(pPostFields)
      Get(pPostFields,Indx)

      IF ~(pPostFields.Value and pPostFields.Id) Then Cycle.

      cfres = self.FormAdd(pPostFields.Id, pPostFields.Value)
      IF cfres <> CURL_FORMADD_OK
        res = -1
      END

    End
Затем цикл по очереди файлов

Код: Выделить всё

   Loop Indx = 1 to Records(pFiles)
      GET(pFiles,Indx)

      szfilename = CLIP(pFiles.item)
      
      cfres = self.FormAddFile(szarg, pFiles.item)
      IF cfres <> CURL_FORMADD_OK
        res = -1
      END
    end

    res = self.FormPost(pUrl,pResponseFile, xferproc)
Но не уверен, что это тоже самое, что

Код: Выделить всё

curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures", CURLFORM_ARRAY, forms, CURLFORM_END);
, т.к. отправляемая структура определена, как
comment string
claimNumber string
files array файлы к комментариям
В моем случае, FormAddFile будет создавать новое поле формы, но имена полей д.б. одинаковые - files.
Допустимо такое решение ?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Само собой, это не то же самое, что

Код: Выделить всё

curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures", CURLFORM_ARRAY, forms, CURLFORM_END);
потому что я в libcurl не использую вызов с флагом CURLFORM_ARRAY, и не планирую добавлять его поддержку. И вообще curl_formadd давно объявлена устаревшей и предлагается пользоваться curl_mime_xxx функциями (TCurlMimeClass в терминах Clarion).
С уважением, ДП
Аватара пользователя
atashe3
Новичок
Сообщения: 21
Зарегистрирован: 26 Декабрь 2021, 13:32

Отправка массива файлов через Libcurl

Сообщение atashe3 »

Хоть тема про отправку файлов
Хотел спросить в классе планируется сделать штатный метод загрузки больших файлов 100мег-4гиг частями?
Я на основе вашего класса сделал такую реализацию
Когда запланируете могу поделиться
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Вы про какой протокол сейчас, http, email, ftp?
С уважением, ДП
Аватара пользователя
atashe3
Новичок
Сообщения: 21
Зарегистрирован: 26 Декабрь 2021, 13:32

Отправка массива файлов через Libcurl

Сообщение atashe3 »

Я про http протокол
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Ну я не думал об этом, потому что не знал, что есть такая проблема.
Хотелось бы для начала узнать, а что не так с отправкой больших файлов? Медленно или вообще не работает?

Рекомендованный способ:

Код: Выделить всё

  curl.Init()
  curl.AddHttpHeader('ContentType:application/x-www-form-urlencoded;  charset=utf-8')
  curl.SetHttpHeaders() 

  mime.Init(curl)
  part = mime.AddPart()
  mime.SetFileData(part, pInputFile)  ! Передаём в libcurl.dll только имя файла, остальное она сделает сама
  mime.SetName(part, 'InputFile')
  
  curl.SetMimePost(mime)
  rc = curl.SendRequest(url)
причём загрузка содержимого файла реализована в самой библиотеке:
Документация libcurl писал(а):The contents of the file is read during the file transfer in a streaming manner to allow huge files to get transferred without using much memory.
С уважением, ДП
Аватара пользователя
atashe3
Новичок
Сообщения: 21
Зарегистрирован: 26 Декабрь 2021, 13:32

Отправка массива файлов через Libcurl

Сообщение atashe3 »

Спасибо за пример и цитату
я не знал о таком применении функции

У меня была проблема с приемом т.е. загрузкой файла очень большого файла с постоянно рвущемся каналом связи по http.
Curl отрабатывает свой таймаут в методе ReadFile и разрывает соединение если хост пропал или еще что.
Поэтому пришлось сделать перегруженный метод ReadFile что бы подсчитывал сколько он загрузил до разрыва связи и снова пытался загрузить с места где остановился в предыдущий раз. И так до конца файла
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Виноват, я неверно истолковал "загрузку больших файлов" как загрузку с клиента на сервер.
Давайте Ваш ReadFile.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Admin »

А Сервер какой нибудь CRC или хеш файла умеет отдавать что бы сверить и понять что файл принят корректно?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Content-Length разве что.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Admin »

Дед Пахом писал(а): 17 Февраль 2023, 12:37 Content-Length разве что.
Это естессно но совсем не то :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
atashe3
Новичок
Сообщения: 21
Зарегистрирован: 26 Декабрь 2021, 13:32

Отправка массива файлов через Libcurl

Сообщение atashe3 »

Коллеги приветствую
Вот пример загрузки
!скачиваем файл
cc# = DownloadFileHttpGet2Part(s_URL, |
'DownFile.png', |
, |
'', |
, |
'', |
i_FileSize, |
i_FileSizeUpload, |
0)

Исходники прилагаю https://disk.yandex.ru/d/3Rd8taHhL7xs5A
в исходнике указан url на маленький файл, для проверки надо скачивать avi
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Отправка массива файлов через Libcurl

Сообщение Дед Пахом »

Спасибо, что весь Clarion не упаковали. Короче, троян там, кидайте только clw+inc. Лучше прямо сюда.
С уважением, ДП
Ответить