загрузите изображение в поле изображения с помощью djangorestframework, используя json, и проверьте это с помощью CURL

Я сделал несколько API в djangorestframework. Это я мог бы проверить как с html-формой API, так и с curl в командной строке.

Теперь у меня есть API для модели с одним из полей ImageField.

Я не могу понять, какую команду curl использовать. Используя синтаксис, который я использовал перед действиями публикации в формате json, это будет:

curl -X POST -S -H 'Content-Type: application/json' -u "username:password" --data-binary '{"otherfields":"something", "photo":"/home/michel/test.jpg"}' 127.0.0.1:8000/api/v1/

но в этом случае фото не будет сохранено и останется пустым (фото необязательное поле)

добавляя -T /home/michel/test.jpg, я получаю сообщение об ошибке, в котором говорится, что 127.0.0.1:800/api/v1/test.jpg не существует в качестве URL-адреса.

В тестовой html-форме djangorestframework все работает нормально.

Используя параметр -F, он говорит, что я могу выполнять только 1 запрос за раз... Я также удалил тип данных из двоичного файла данных.

Может ли кто-нибудь помочь мне, как сделать этот пост curl с изображением и другими данными в json в 1 команде.


person michel.iamit    schedule 09.07.2012    source источник


Ответы (1)


После долгой головоломки это, кажется, помогает:

  • поместите все аргументы json в отдельные аргументы -F
  • использовать только заголовок Accept (не Content-Type)
  • И указать тип изображения
  • Используйте @, чтобы указать локальный файл для загрузки

    curl -X POST -S \
      -H 'Accept: application/json' \
      -u "username:password" \
      -F "otherfields=something" \
      -F "photo=@/home/michel/test.jpg;type=image/jpg" \
      http://127.0.0.1:8000/api/v1/
    

Кстати, я знаю, что все это есть на сайте документации curl, но просто пропустил пример всех этих вещей вместе, так как есть много вариантов, которые можно попробовать.

person michel.iamit    schedule 13.07.2012
comment
Что я делаю неправильно? $ curl -X POST -S -H "Accept-Language: en-en" -H 'Accept: application/json' \ -F "name=Avatar" \ -F "username=avatar" \ -F "password=A1234567" \ -F "[email protected]" \ -F "token=748e14e32ce165d06365d3c9a00cee3f" \ -F "avatar=@/home/moreno/Pictures/avatar004.jpg;type=image/jpg" 127.0.0.1:8000/api/v1/users/register/ ответ 400 {"username":["This field is required."],"password":["This field is required."],"name":["This field is required."],"avatar":["No file was submitted."],"email":["This field is required."]} - person Moreno; 09.03.2016
comment
отсутствует одно из обязательных полей. Вам нужно использовать -u перед именем пользователя, а не -F (если это также не поле в API, чем вам нужно использовать оба) - person michel.iamit; 21.03.2016
comment
@michel-iamit спасибо. Я решил отправить изображения в виде поля base64, например: curl -H "Authorization: JWT ey...5U" -d "name=User Name&username=user&[email protected]&password=A1234567" --data-urlencode 'avatar='"$( base64 ~/Pictures/avatar004.jpg)"'' --data-urlencode 'image='"$( base64 ~/Pictures/avatar001.jpg)"'' --data-urlencode 'picture='"$( base64 ~/Pictures/577383.jpg)"'' http://localhost:8000/api/v1//register/ - person Moreno; 24.03.2016