Как загрузить файлы (multipart/form-data) с многомерным POSTFIELDS, использующим PHP и ЗАВИХРЕНИЕ?

У меня есть проблемы с регистрацией многомерного массива с загрузками файла с помощью PHP и ЗАВИХРЕНИЯ.

Многомерный массив, например:

$post['question'] = 'Are you human?';
$post['answers'] = array('yes', 'no', 'maybe');
$post['file'] = '@/path/to/file';

// Output:

Array(
    'question' => Are you human?,
    'answers' => Array(
        '0' => yes,
        '1' => no,
        '2' => maybe
        ),
    'file' => @/path/to/file
)

Существует несколько вещей, почему это не работало бы, если Вы просто пытаетесь отправить это с CURLOPT_POSTFIELDS в ЗАВИХРЕНИИ как это:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

$response = curl_exec($ch);

В первую очередь, в официальном описании PHP CURLOPT_POSTFIELDS говорится:

Полные данные для регистрации в операции "POST" HTTP. Для регистрации файла предварительно ожидайте имя файла с и используйте полный путь. Это может или быть передано как строка urlencoded как 'para1=val1¶2=val2&...' или как массив с именем поля, столь же ключевым и полевые данные как значение. Если значение будет массивом, то заголовок Типа контента будет установлен на multipart/form-data.

Это кажется, что можно передать какой-либо вид массива к праву POSTFIELDS? Неправильно. POSTFIELDS только принимает нескалярные величины и будет дросселировать с a Array to string conversion ошибка при передаче многомерных массивов. Так, единственная другая опция, которую Вы имеете, к http_build_query() Ваш массив, чтобы смочь передать многомерные массивы, которые не дросселируют.

Но.. поскольку можно читать в примечании на странице PHP:

Примечание: Передача массива к CURLOPT_POSTFIELDS закодирует данные multipart/form-data, в то время как передача закодированной URL строки закодирует данные application/x-www-form-urlencoded.

Сообщение не будет multipart/form-data, закодированным при передаче строки urlencoded POSTFIELDS, заставляя загрузку файла перестать работать.

Таким образом, кажется почти невозможным объединить два с ЗАВИХРЕНИЕМ, в то время как это не была бы проблема при использовании регулярной HTML-формы.

Мой вопрос: действительно ли возможно обойти эту странную причуду ЗАВИХРЕНИЯ, чтобы смочь отправить загрузки файла и многомерные массивы?

6
задан Melvin 10 August 2010 в 21:02
поделиться