Я хотел бы использовать cURL не только для отправки параметров данных в HTTP POST, но и для загрузки файлов с определенным именем формы. Как мне это сделать?
Параметры HTTP Post:
userid = 12345 filecomment = Это файл изображения
Загрузка файла HTTP: Расположение файла = /home/user1/Desktop/test.jpg Имя формы для файла = изображение (соответствует $ _FILES ['image'] на стороне PHP)
Я вычислил часть команды cURL следующим образом:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
Проблема, которую я получаю, заключается в следующем:
Notice: Undefined index: image in /var/www/uploader.php
Проблема в том, что я использую $ _FILES ['image'] для получения файлов в скрипте PHP.
Как мне настроить мои команды cURL соответственно?
-d
опцию по ошибке, которая требует ввода URL в кодировке. Я должен был удалить это, когда я обновил ответ на-F
вариант. Спасибо, что поймали это.@
вimage=@/..
?Перехват идентификатора пользователя в качестве переменной пути (рекомендуется):
Поймать идентификатор пользователя как часть формы:
или:
источник
"Content-Type: multipart/form-data"
Вот мое решение, я прочитал много постов, и они были действительно полезны. Наконец, я написал некоторый код для небольших файлов с cURL и PHP, который я считаю действительно полезным.
С этим мы должны попасть в «api.endpoint.post», в котором находятся следующие переменные. Вы можете легко протестировать этот скрипт, и вы должны получить эти отладки для функции
postFile()
в последнем ряду.Это должно работать хорошо, они могут быть лучшими решениями, но это работает и действительно полезно понять, как работает Mime Boundary и multipart / from-data на PHP и библиотеке cURL.
источник
если вы загружаете двоичный файл, такой как CSV, используйте формат ниже, чтобы загрузить файл
источник
--data-binary
инструктируетcurl
к не делать какие - либо предварительной обработки данных, в отличие от--data
флага. чтобы обратиться к вашему комментарию напрямую, обратите внимание, что текст также является двоичным, но мы можем интерпретировать его как символы ASCII. Если вы действительно хотите конкретный пример, подумайте о CSV, чьи поля содержат эмодзи. Их байты напрямую не отображаются в текстеПроблема, которая привела меня сюда, оказалась основной ошибкой пользователя - я не включил
@
знак в путь к файлу, и поэтому curl публиковал путь / имя файла, а не его содержимое. ПоэтомуContent-Length
значение было 8, а не 479, которые я ожидал увидеть, учитывая длину моего тестового файла.Content-Length
Заголовок будет автоматически вычисляться при завиток читает и сообщений файл.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Длина содержимого: 479 ...
Размещение этого здесь, чтобы помочь другим новичкам в будущем.
источник
В качестве альтернативы
curl
, вы можете использовать HTTPie , CLI, cURL-подобный инструмент для людей.Инструкции по установке: https://github.com/jakubroztocil/httpie#installation
Затем запустите:
источник
После многих попыток эта команда сработала для меня:
источник
Вот как правильно экранировать произвольные имена загруженных файлов с помощью
bash
:источник
Я получил это работает с этой командой
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
источник