File 在php中使用多部分/表单数据请求发送文件

File 在php中使用多部分/表单数据请求发送文件,file,curl,binary,request,multipartform-data,File,Curl,Binary,Request,Multipartform Data,我将图像资源存储在变量中,需要使用其http API和PHP将其发送到服务器。我必须发送内容类型为multipart/form数据的请求。因此,我需要发出类似于发送带有文件输入和enctype=multipart/form data属性的表单时的请求。 我试过这个: <?php $url = 'here_is_url_for_web_API'; $input = fopen('delfin.jpg','r'); $header = array('Content-Type: m

我将图像资源存储在变量中,需要使用其http API和PHP将其发送到服务器。我必须发送内容类型为multipart/form数据的请求。因此,我需要发出类似于发送带有文件输入和enctype=multipart/form data属性的表单时的请求。 我试过这个:

<?php
$url = 'here_is_url_for_web_API';
$input = fopen('delfin.jpg','r');       
$header = array('Content-Type: multipart/form-data');
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_USERPWD, "user:password");
curl_setopt($resource, CURLOPT_HTTPAUTH, CURLAUTH_ANYSAFE);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, true );
curl_setopt($resource, CURLOPT_INFILESIZE, 61631);
curl_setopt($resource, CURLOPT_INFILE, $input);
$result = curl_exec($resource);
curl_close($resource);
var_dump($result);
?>

我不知道响应应该是什么样的,但这返回: http状态405
错误报告是:请求的资源()不允许使用指定的HTTP方法。

如果使用CURL,您只需:

1,将标题“内容类型”设置为“多部分/表单数据;”

2,将curl的选项“RETURNTRANSFER”设置为true(使用curl的选项方法)

3,将curl的选项“POST”设置为true(使用curl的选项方法)

4、获取文件的源代码(从PHP中的fopen获得的内容):


5、在$post变量中使用参数为CURL的post方法

在带有CURL的post内容中使用多部分/表单数据和边界

$filenames=array(“/tmp/1.jpg”和“/tmp/2.png”);
$files=array();
foreach(文件名为$f){
$files[$f]=文件获取内容($f);
}
//更多用于POST请求的字段
$fields=array(“f1”=>“value1”,“另一个字段2”=>“另一个值”);
$url=”http://example.com/upload";
$curl=curl_init();
$url\u data=http\u build\u query($data);
$boundary=uniqid();
$delimiter='-------------'$边界;
$post_data=构建_数据_文件($boundary、$fields、$files);
curl_setopt_数组($curl,数组(
CURLOPT_URL=>$URL,
CURLOPT_RETURNTRANSFER=>1,
CURLOPT_MAXREDIRS=>10,
CULLOPT_超时=>30,
//CURLOPT_HTTP_VERSION=>CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST=>“POST”,
CURLOPT_POST=>1,
CURLOPT_POSTFIELDS=>$post_数据,
CURLOPT_HTTPHEADER=>数组(
//“授权:持票人$TOKEN”,
“内容类型:多部分/表单数据;边界=”.$delimiter,
“内容长度:”.strlen($post_数据)
)
));
//
$response=curl\u exec($curl);
$info=curl\u getinfo($curl);
//echo“code:${info['http_code']}”;
//打印($info['request_header']);
var_dump($response);
$err=curl\u error($curl);
回声“错误”;
var_dump($err);
curl_close($curl);
函数生成数据文件($boundary、$fields、$files){
$data='';
$eol=“\r\n”;
$delimiter='-------------'.$boundary;
foreach($name=>$content形式的字段){
$data.=“-”$delimiter.$eol
.“内容处置:表单数据;name=“”.$name.\”.$eol.$eol
.$content.$eol;
}
foreach($name=>$content形式的文件){
$data.=“-”$delimiter.$eol
.“内容处置:表单数据;name=“”.$name.”filename=“.$name.”.$eol
//.“内容类型:图像/png”。$eol
.“内容传输编码:二进制”。$eol;
$data.=$eol;
$data.=$content.$eol;
}
$data.=“-”$delimiter.“-”$eol;
返回$data;
}
请参见此处的完整示例:

$tempFile = tempnam(sys_get_temp_dir(), 'File_');                
file_put_contents($tempFile, $source);
$post = array(
    "uploadedFile" => "@" . $tempFile, //"@".$tempFile.";type=image/jpeg",
);