我知道我可以用这个语法来发送一个文件,使用php,post和curl。
$post = array( "file_box"=>"@/path/to/myfile.jpg", ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
我如何获取一个字符串,构建一个临时文件,并使用完全相同的语法发送它?更新:我更喜欢使用tmpfile()或php://memory,这样我就不必处理文件创建。
wdebmtf21#
您可以在临时目录中使用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);
5rgfhyps2#
从PHP 8.1开始,还有CURLStringFile,它允许你发送它而不需要临时文件:
CURLStringFile
$txt = 'test content'; $file = new \CURLStringFile($txt, 'filename.txt', 'text/plain'); $ch = curl_init('https://example.com/upload'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $file]); curl_exec($ch);
cotxawn73#
您可以使用file_put_contents创建一个临时文件,只需确保目标目录是可写的。
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);
c0vxltue4#
来自http://php.net/manual/en/class.curlfile.php#115161
$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);
4条答案
按热度按时间wdebmtf21#
您可以在临时目录中使用tempnam创建一个文件:
5rgfhyps2#
从PHP 8.1开始,还有
CURLStringFile
,它允许你发送它而不需要临时文件:cotxawn73#
您可以使用
file_put_contents
创建一个临时文件,只需确保目标目录是可写的。c0vxltue4#
来自http://php.net/manual/en/class.curlfile.php#115161