Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4 / 6 сообщений из 6, страница 1 из 1
14.07.2021, 10:58
    #40083725
RM3G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
Необходимо загрузить картинку на свой сайт на движке Wordpress через работающий Rest API, используя компонент idHTTP. При выполнении кода, представленного ниже, idHTTP выдаёт исключение HTTP/1.1 400 Bad Request. Подключение Rest Api идёт через basic auth, и проверено на работоспособность путём постинга на wordpress тестовой записи - всё прекрасно работает. Но картинку загрузить не даёт

Немного отступления. Новичёк в REST API и уже неделю возвращаюсь к этой задаче. В первый же день работы мне удалось запостить тестовую запись на Wordpress и я думал там всё также легко. Перерыт весь интернет по теме загрузки файлов на WP и перепробовал кучу вариантов параметров, типов данных и ContentDisposition. Сначала пользовался дельфовскими компонентами REST, пока не понял что для моих задач обычного привычного INDY хватает. Кроме того у одного пользователя Стэка получилось залить картинку после того как он перешёл с компонентов Delphi RestClient на INDY, но он не написал как, и обратиться к нему я не могу. Поэтому прошу глянуть - напишите любые идеи, куда двигаться дальше. Спасибо


Вариант 1, файл в потоке
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
var 
  Params: TIdMultipartFormDataStream;
   jpgFoto: TMemoryStream;
begin
  Params := TIdMultipartFormDataStream.Create;
  Params.AddFormField('mime-type','image/jpeg');

  jpgFoto := TStringStream.Create('');
  jpgFoto := TMemoryStream.Create;
  jpgFoto.LoadFromFile('D:\Europe\loka.jpg');
  jpgFoto.Position := 0;
  idhttp2.Request.Accept := 'application/json; charset= UTF-8';
  idhttp2.Request.Authentication := TIdBasicAuthentication.Create;
  idhttp2.Request.Authentication.Username:= 'username';
  idhttp2.Request.Authentication.Password := 'password';
  idhttp2.Request.BasicAuthentication := true;
  idhttp2.Request.ContentDisposition := 'form-data; filename="loka.jpg"';
  idhttp2.Request.ContentType := 'application/json; charset= UTF-8';

  try 
    idhttp2.Post('http://САЙТ/wp-json/wp/v2/media/', Params , jpgFoto);
  except
     memo1.Text :=  idhttp2.ResponseText;
  end;
  jpgFoto.Free;



Вариант 2, файл в параметре

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
var 
   Params: TIdMultipartFormDataStream;
begin
  s := TstringList.Create;
  Params := TIdMultipartFormDataStream.Create;
  Params.AddFormField('mime-type','image/jpeg');
  Params.AddFile('', 'D:\Europe\loka.jpg', '');//?

  idhttp2.Request.Accept := 'application/json; charset= UTF-8';
  idhttp2.Request.Authentication := TIdBasicAuthentication.Create;
  idhttp2.Request.Authentication.Username:= 'username';
  idhttp2.Request.Authentication.Password := 'password';
  idhttp2.Request.BasicAuthentication := true;

  idhttp2.Request.ContentDisposition := 'form-data; filename="loka.jpg"';
//  idhttp2.Request.ContentType := 'multipart/form-data';
  idhttp2.Request.ContentType := 'application/json; charset= UTF-8';

 try
    idhttp2.Post('http://САЙТ/wp-json/wp/v2/media/', Params);
 except
    memo1.Text :=  idhttp2.ResponseText;
 end;



Дополнения
  • с авторизацией нет проблемы, я также авторизовался когда постил сообщения на ВП, всё работало. Проблема залить картинку
  • ContentDisposition в интернете описываются разные форматы, пробовал разные, результат один. оставил который используется чаще
  • Аналогично с ContentType, но как я понял это вообще не обязательный параметр, Wordpress сам понимает что ты туда грузишь
  • вообще в первом варианте, где файл идёт отдельно в потоке, Params можно оставить пустым?
  • если есть примеры не INDY, но рабочие, пишите
  • если вы готовы помочь в частном порядке, доведя код до работоспособного состояния, пишите тоже
...
Рейтинг: 0 / 0
14.07.2021, 11:42
    #40083730
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
RM3G,

берешь сниффер и заведомо работающий софт. смотришь какая разница между твоим запросом и сторонним. приводишь в соответствие. профит.
...
Рейтинг: 0 / 0
14.07.2021, 13:00
    #40083758
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
RM3G,

вот тут нашёлся пример на JavaScript'e. Там вообще другие поля формы, чем у вас:
Код: javascript
1.
2.
3.
		formData.append( 'file', file );   // здесь у вас знак вопроса 
		formData.append( 'title', title );
		formData.append( 'caption', caption );
...
Рейтинг: 0 / 0
14.07.2021, 13:00
    #40083759
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
P.S.
правда там инфа 4-х летней давности
...
Рейтинг: 0 / 0
14.07.2021, 13:11
    #40083764
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
P.P.S.
сорри, я кажется вас не туда направил

вот более простой пример

https://wordpress.stackexchange.com/questions/209928/add-media-with-wp-rest-api-v2

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
//PHP CURL
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'EndPoint',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('LocalFilePathHere')),
  CURLOPT_HTTPHEADER => array(
    'Content-Disposition: attachment; filename=abc.jpg',
    'Content-Type: image/jpeg',
    'Authorization: XXX YYY'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
...
Рейтинг: 0 / 0
14.07.2021, 19:31
    #40083883
RM3G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
Кроик Семён, большое спасибо! Я заполнял неправильно название поле с файлом. Это просто "file". Теперь всё работает и я отмечаю!

Рабочий вариант загрузки изображение (или другого поддерживаемого файла) в Wordpress Rest Api из Delphi

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var
   Params: TIdMultipartFormDataStream;
begin
 Params := TIdMultipartFormDataStream.Create;
 Params.AddFormField('content-type','image/jpeg');
 Params.AddFile('file', 'D:\Europe\fhhknknhkwy.jpeg', '');//поле с файлом называется file, это очень важно!
 idhttp2.Request.Accept := 'application/json; charset= UTF-8';
 idhttp2.Request.Authentication := TIdBasicAuthentication.Create;
 idhttp2.Request.Authentication.Username:= 'имя пользователя';
 idhttp2.Request.Authentication.Password := 'пароль';
 idhttp2.Request.BasicAuthentication := true;

 idhttp2.Request.ContentDisposition := 'form-data; filename="europe-swiss.jpg"';//тут можно писать любое имя файла, в вордпресс загрузиться файл с тем же названием что он был на диске 
 idhttp2.Request.ContentType := 'application/json; charset= UTF-8';

 try
     idhttp2.Post('https://сайт/wp-json/wp/v2/media/', Params);
 except
   memo1.Text :=  idhttp2.ResponseText;
 end;

end;




makhaon, спасибо! Я уже поставил сниффер, и буду дальше пользоваться им при изучении REST
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4 / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]