【问题标题】:Send string as a file using curl and php使用 curl 和 php 将字符串作为文件发送
【发布时间】:2011-09-03 05:55:31
【问题描述】:

我知道我可以使用这种语法通过 php、post 和 curl 发送文件。

$post = array(
    "file_box"=>"@/path/to/myfile.jpg",
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 

如何获取一个字符串,构建一个临时文件并使用完全相同的语法发送它?

更新: 我更喜欢使用 tmpfile() 或 php://memory,这样我就不必处理文件创建了。

【问题讨论】:

  • 这个问题的重复:POST a file string using cURL in PHP?(你会在那里找到答案)
  • 那里不是真正的答案。到目前为止,@emil 给出了一个很好的解决方案。
  • Erm,是的,当您将内容包含在字符串中时,通过 curl 发送文件是一个真正的答案。 Tatu 的答案是涉及临时文件的不同解决方案(因此您不是将字符串作为文件发送,而是发送实际文件)。

标签: php post curl


【解决方案1】:

您可以在临时目录中使用tempnam 创建一个文件:

$string = 'random string';

//Save string into temp file
$file = tempnam(sys_get_temp_dir(), 'POST');
file_put_contents($file, $string);

//Post file
$post = array(
    "file_box"=>'@'.$file,
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

//do your cURL work here...

//Remove the file
unlink($file);

【讨论】:

    【解决方案2】:

    您可以使用file_put_contents 创建一个临时文件,只需确保目标目录是可写的。

    $path = '/path/to/myfile.txt';    
    file_put_contents($myData, $path);
    
    $post = array(
        "file_box"=>"@".$path,
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    
    # Delete the file if you don't need it anymore
    unlink($path);
    

    【讨论】:

      【解决方案3】:

      来自http://php.net/manual/en/class.curlfile.php#115161

      function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {
          
                   // invalid characters for "name" and "filename"
                   static $disallow = array("\0", "\"", "\r", "\n");
      
                   // build normal parameters
                   foreach ($assoc as $k => $v) {
                       $k = str_replace($disallow, "_", $k);
                       $body[] = implode("\r\n", array(
                           "Content-Disposition: form-data; name=\"{$k}\"",
                           "",
                           filter_var($v),
                       ));
                   }
      
                   // build file parameters
                   foreach ($files as $k => $v) {
                       switch (true) {
                           case false === $v = realpath(filter_var($v)):
                           case !is_file($v):
                           case !is_readable($v):
                               continue; // or return false, throw new InvalidArgumentException
                       }
                       $data = file_get_contents($v);
                       $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
                       $k = str_replace($disallow, "_", $k);
                       $v = str_replace($disallow, "_", $v);
                       $body[] = implode("\r\n", array(
                           "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
                           "Content-Type: image/jpeg",
                           "",
                           $data,
                       ));
                   }
      
                   // generate safe boundary
                   do {
                       $boundary = "---------------------" . md5(mt_rand() . microtime());
                   } while (preg_grep("/{$boundary}/", $body));
      
                   // add boundary for each parameters
                   array_walk($body, function (&$part) use ($boundary) {
                       $part = "--{$boundary}\r\n{$part}";
                   });
      
                   // add final boundary
                   $body[] = "--{$boundary}--";
                   $body[] = "";
      
                   // set options
                   return @curl_setopt_array($ch, array(
                       CURLOPT_POST       => true,
                       CURLOPT_POSTFIELDS => implode("\r\n", $body),
                       CURLOPT_HTTPHEADER => array(
                           "Expect: 100-continue",
                           "Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type
                       ),
                   ));
               }
      
      $array1=array('other_post_field'=>'value');
      $array2=array('file'=>'document_content_string');
      $ch = curl_init();       
      curl_setopt($ch, CURLOPT_URL,$url);
      curl_custom_postfields($ch,$array1,$array2);//above custom function
      $output=curl_exec($ch);
      close($ch);
      

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 2011-06-12
        • 2015-04-22
        • 2011-12-19
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多