powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
6 сообщений из 6, страница 1 из 1
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
    #40083725
RM3G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо загрузить картинку на свой сайт на движке 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
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
    #40083730
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RM3G,

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

вот тут нашёлся пример на JavaScript'e. Там вообще другие поля формы, чем у вас:
Код: javascript
1.
2.
3.
		formData.append( 'file', file );   // здесь у вас знак вопроса 
		formData.append( 'title', title );
		formData.append( 'caption', caption );
...
Рейтинг: 0 / 0
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
    #40083759
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
правда там инфа 4-х летней давности
...
Рейтинг: 0 / 0
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
    #40083764
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
    #40083883
RM3G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён, большое спасибо! Я заполнял неправильно название поле с файлом. Это просто "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
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Загрузка изображений в Wordpress REST API через Indy idHTTP Delphi 10.4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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