在PHP上使用Curl发送空<input type =“file”/>字段

时间:2011-02-28 01:25:26

标签: php file curl input

欢迎大家。

这是我遇到的问题: 我正在尝试使用PHP和CURL将文件数据发送到服务器。 服务器接受6张照片的数据。 如果$ _FILES数组中的项目少于6个 - 那就错了。

所以,如果我发送所有6张照片,一切都很顺利。 但如果照片较少,则空照片的值会转到$ _POST数组。

我阅读了Curl文档但却找不到这种可能性。 如何使用CURL发送文件类型的空值?

4 个答案:

答案 0 :(得分:1)

我不认为这是可能的:在浏览器中,根本不会将未使用的文件输入附加到请求,因此没有要解析的“空文件字段”值。

当PHP收到携带上传文件的请求时,

$_FILES将由PHP构建。

不确定你在这里尝试做什么 - 如果你没有首先发送六张图片,你是不是已经知道请求会失败?

答案 1 :(得分:1)

我有同样的问题,这有效:

curl  -F "file_1=@files.zip" -F "file_2=@/dev/null;filename=" -F "file_3=@/dev/null;filename="

答案 2 :(得分:0)

我遇到了同样的问题。我的 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;
  }

} 

答案 3 :(得分:0)

这是您始终可以发送文件输入字段的方法,即使它为空:

<input type="text" name="team_logo" hidden>
<input type="file" name="team_logo">

我不熟悉 curl,但这适用于 php laravel。