Могут ли PHP-методы curl загрузить файл и строку с начальным символом @ в одном запросе? - PullRequest
5 голосов
/ 01 апреля 2011

Я бы хотел создать POST-запрос с использованием PHP-метода curl_ *, который выполняет следующие действия:

  1. загружает файл (поэтому запрос должен быть отправлен как multipart / form-data)
  2. отправляет строку текста, где строка начинается с символа "@"

Например, следующий код работает, потому что в строке текста нет начального символа "@":

<?php

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => 'text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>

Но он прерывается, если строка начинается с символа "@", что приводит к тому, что curl ищет несуществующий файл с именем "text_to_upload" (обратите внимание, что единственным изменением является добавление ведущегоСимвол "@" в поле upload_text):

<?php

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => '@text_to_upload'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
curl_exec($curl);
curl_close($curl);

?>

Итак ... можно ли отправлять текст с начальным символом "@" при одновременной загрузке файла с использованием методов curl_ * вPHP?

Конечный результат (если возможно) должен быть эквивалентен использованию командной строки curl:

curl -F 'upload_=@file_to_upload.png' --form-string 'upload_text=@text_to_upload' 'http://example.com/upload-test'

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 августа 2012

Добавить строку с нулевым символом "\0":

<?php
    $postfields = array(
        'upload_file' => '@file_to_upload.png',
        'upload_text' => sprintf("\0%s", '@text_to_upload')
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://example.com/upload-test');
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields);
    curl_exec($curl);
    curl_close($curl);
?>
0 голосов
/ 07 февраля 2012

Альтернатива 1

Скорее всего вам придется urlencode параметр.

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => urlencode('@text_to_upload')
);

Также, urldecode на стороне сервера.

Альтернатива 2

Просто добавьте пробел в начале upload_text независимо от его содержимого.

$postfields = array(
    'upload_file' => '@file_to_upload.png',
    'upload_text' => ' @text_to_upload'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...