Отправка пустых <input type = "file"> полей с помощью Curl на PHP - PullRequest
1 голос
/ 28 февраля 2011

Приветствую всех.

Вот моя проблема: я пытаюсь отправить данные с файлами на сервер, используя PHP и CURL.Сервер принимает данные с 6 фотографий.И если в массиве $ _FILES меньше 6 элементов - это ошибка.

Так что, если я отправлю все 6 фотографий, все будет отлично.Но если фотографий меньше, то значение с пустой фотографией отправляется в массив $ _POST.

Я прочитал документацию по Curl, но не смог найти такой возможности.Как это можно сделать с помощью CURL для отправки пустого значения типа файла?

Ответы [ 3 ]

1 голос
/ 16 июня 2011

У меня была такая же проблема, и это работает:

curl  -F "file_1=@files.zip" -F "file_2=@/dev/null;filename=" -F "file_3=@/dev/null;filename="
1 голос
/ 28 февраля 2011

Я не думаю, что это возможно: в браузере неиспользуемый ввод файла просто не будет прикреплен к запросу вообще, поэтому нет значения "пустое поле файла" для анализа.$_FILES будет построен PHP, когда он получит запрос, содержащий загруженные файлы.

Не уверен, что вы пытаетесь сделать здесь - разве вы не знаете, что запрос не будет выполнен, если у вас нет шести изображений для отправки в первую очередь?

0 голосов
/ 02 февраля 2016

У меня была такая же проблема. Мое PHP решение - отправлять данные, как это делает браузер. Просто попробуйте использовать пример 1:

Пример 1

$postData = '------WebKitFormBoundarywPZdrW1CWvlHZ7xB
Content-Disposition: form-data; name="image[3]"; filename=""
Content-Type: application/octet-stream


------WebKitFormBoundarywPZdrW1CWvlHZ7xB--';
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);


Работает нормально? Теперь нам нужна функция для автоматического построения этих данных. Пример 2 - простая иллюстрация того, как это сделать с помощью функции CurlHelper :: prepareMultiPartData () . Вам необходимо создать класс CurlHelper до этого (код указан ниже).

Пример 2

$data=array( //array can be multidimensional like this
  'image' => array( 
    3 => curl_file_create('', '', ''),
  ),
);
$boundary = 'webkit';
$postData = CurlHelper::prepareMultiPartData($data, $boundary);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'url');//TODO set your own url
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: multipart/form-data; boundary=$boundary"));
$response = curl_exec($ch);

класс CurlHelper

class CurlHelper {
  /**
   * @param array $data POST data. could be multidimensional array
   * @param string $boundary if $boundary == '' it will be generated automatically
   * @return string formatted POST data separeted with boundary like in browser.
   */
  static function prepareMultiPartData($data, &$boundary){
    $boundary = self::_createBoundary($boundary);
    $boundaryMiddle = "--$boundary\r\n";
    $boundaryLast = "--$boundary--\r\n";

    $res = self::_prepareMultipartData($data, ["\r\n"]);
    $res = join($boundaryMiddle, $res) . $boundaryLast;
    return $res;
  }

  static private function _createBoundary($boundaryCustom = '') {
    switch ($boundaryCustom) {
      case '':
        return uniqid('----').uniqid();
      case 'chrome':
      case 'webkit':
        return uniqid('----WebKitFormBoundary').'FxB';
      default:
        return $boundaryCustom;
    }
  }

  static private function _prepareMultipartData($data, $body, $keyTpl = ''){
    $ph = '{key}';
    if ( !$keyTpl ) {
      $keyTpl = $ph;
    }
    foreach ($data as $k => $v) {
      $paramName = str_replace($ph, $k, $keyTpl);
      if ( (class_exists('CURLFile') && $v instanceof \CURLFile) || strpos($v, '@') === 0 ) {
        if (is_string($v)) {
          $buf = strstr($v,'filename=');
          $buf = explode(';', $buf);
          $filename = str_replace('filename=', '', $buf[0]);
          $mimeType = (isset($buf[1])) ? str_replace('type=', '', $buf[1]) : 'application/octet-stream';
        } else {
          $filename = $v->name;
          $mimeType = $v->mime;
        }
        $str = 'Content-Disposition: form-data; name="' . $paramName . '"; filename="' . $filename . "\"\r\n";
        $str .= 'Content-Type: ' . $mimeType . "\r\n\r\n\r\n";
        $body[] = $str;
      } elseif ( is_array($v) ) {
        $body = self::_prepareMultipartData($v, $body, $paramName.'['.$ph.']');
      } else {
        $body[] = 'Content-Disposition: form-data; name="' . $paramName . "\"\r\n\r\n" . $v . "\r\n";
      }
    }
    return $body;
  }

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...