天天看点

php curl form-data,关于curl:使用php中的multipart / form-data请求发送文件

我将图像资源存储在变量中,需要使用其HTTP API和PHP发送到服务器。 我必须发送内容类型为multipart / form-data的请求。 因此,当发送带有文件输入的表单并发送enctype = multipart / form-data属性时,我需要进行类似的请求。

我尝试了这个:

$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中使用multipart / form-data和POST内容中的边界。

$filenames = array("/tmp/1.jpg","/tmp/2.png");;

$files = array();

foreach ($filenames as $f){

$files[$f] = file_get_contents($f);

}

// more fields for POST request

$fields = array("f1"=>"value1","another_field2"=>"anothervalue");

$url ="http://example.com/upload";

$curl = curl_init();

$url_data = http_build_query($data);

$boundary = uniqid();

$delimiter = '-------------' . $boundary;

$post_data = build_data_files($boundary, $fields, $files);

curl_setopt_array($curl, array(

CURLOPT_URL => $url,

CURLOPT_RETURNTRANSFER => 1,

CURLOPT_MAXREDIRS => 10,

CURLOPT_TIMEOUT => 30,

//CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

CURLOPT_CUSTOMREQUEST =>"POST",

CURLOPT_POST => 1,

CURLOPT_POSTFIELDS => $post_data,

CURLOPT_HTTPHEADER => array(

//"Authorization: Bearer $TOKEN",

"Content-Type: multipart/form-data; boundary=" . $delimiter,

"Content-Length:" . strlen($post_data)

),

));

//

$response = curl_exec($curl);

$info = curl_getinfo($curl);

//echo"code: ${info['http_code']}";

//print_r($info['request_header']);

var_dump($response);

$err = curl_error($curl);

echo"error";

var_dump($err);

curl_close($curl);

function build_data_files($boundary, $fields, $files){

$data = '';

$eol ="

";

$delimiter = '-------------' . $boundary;

foreach ($fields as $name => $content) {

$data .="--" . $delimiter . $eol

. 'Content-Disposition: form-data; name="' . $name .""".$eol.$eol

. $content . $eol;

}

foreach ($files as $name => $content) {

$data .="--" . $delimiter . $eol

. 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . '"' . $eol

//. 'Content-Type: image/png'.$eol

. 'Content-Transfer-Encoding: binary'.$eol

;

$data .= $eol;

$data .= $content . $eol;

}

$data .="--" . $delimiter ."--".$eol;

return $data;

}

在此处查看完整的示例:https://gist.github.com/maxivak/18fcac476a2f4ea02e5f80b303811d5f

如果使用CURL,则必须:

1,将标头" Content-Type"设置为" multipart / form-data";

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

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

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

$tempFile = tempnam(sys_get_temp_dir(), 'File_');

file_put_contents($tempFile, $source);

$post = array(

"uploadedFile" =>"@" . $tempFile, //"@".$tempFile.";type=image/jpeg",

);

5,将CURL的post方法与$ post变量中的参数一起使用