Подтвердить что ты не робот

Не удается отправить файл в виде данных формы с помощью cURL

Я пытаюсь отправить запрос cURL через командную строку. Ниже мой запрос

curl -i http://localhost/test/index.php 
-X POST 
-F "name=file.png" 
-F "[email protected]/var/www/html/test/file.png"

Проблема, с которой я столкнулась, заключается в том, что файл не отправляется с запросом. Имя получает отправленный штраф, но не файл. Может ли кто-нибудь увидеть, что я делаю что-то явно неправильно?

Я проверяю разрешение на файл, поскольку я думал, что это может быть проблема, но они в порядке

Бэкэнд написан с использованием фреймворка PHP Slim, и я делаю следующее $app->request->post('content');

4b9b3361

Ответ 1

Если вы хотите иметь доступ к содержимому файла с помощью $app->request->post('content');, ваш запрос curl должен использовать < вместо @ для поля content,

curl -i http://localhost/test/index.php -X POST -F "name=file.png" \
  -F "content=</var/www/html/test/file.png"

Из справочной страницы curl:

Чтобы заставить               'content', чтобы быть файлом, префикс имени файла знаком @. Чтобы просто получить часть содержимого из файла, префикс имени файла с символом <. Разница между значениями @и < это то, что @заставляет файл прикрепляться к сообщению в качестве загрузки файла,               в то время как < создает текстовое поле и просто получает содержимое для этого текстового поля из файла.

Используя @, вы пометили это поле как файл. Технически это добавляет заголовок Content-Disposition в поле (RFC 2388, если вам интересно). PHP обнаруживает это и автоматически сохраняет поле внутри $_FILES вместо $_POST, как заметил в комментарии Рафаэль Мали, поэтому вы не можете получить доступ к содержимому с помощью $app->request->post.

Вам следует подумать о том, чтобы переключиться на использование $_FILES в вашем бэкэнд, если вы хотите поддерживать загрузку с использованием элементов и форм браузера <input type=file>. Они всегда устанавливают заголовок Content-Disposition.

Ответ 2

В php версии 5.2.6 и ниже есть bug. Проверьте последнюю версию и тест на php. Это может быть проблемой.

Ответ 3

@Bender используйте символ @, но внесите изменения в свой PHP-код, чтобы использовать переменную $_ FILES. Это поможет. Убедитесь, что вы предоставили полный Абсолютный путь для cURL. Иначе вы получите сообщение об ошибке.

Пожалуйста, укажите тот же вид SO здесь: Загрузка файла в Slim Framework с использованием curl в php

Надеюсь, что это поможет.