我需要能够通过PHP和CURL向服务器发送multipart / form-data post请求。
我能够获得正确的内容类型以及发送常用变量,例如下面的内容。
------------------------------2f860b21c344
Content-Disposition: form-data; name="contactId"
8
------------------------------2f860b21c344
Content-Disposition: form-data; name="wt"
00:00:00
------------------------------2f860b21c344
本节中出现此问题:
-----------------------------221901842288
Content-Disposition: form-data; name="attchmnt[0]"; filename=""
Content-Type: application/octet-stream
-----------------------------221901842288
我最接近的是:
------------------------------2f860b21c344
Content-Disposition: form-data; name="attchmnt[0]"
filename="";type=application/octet-stream
------------------------------2f860b21c344
我正在使用数组作为POST数据,因为需要使用multipart标头,因此就CURL代码而言,它100%工作只是这个数组不起作用。 以下是完整的DataArray:
<?PHP
$dataArray = array(
'tid' => '',
'parentId' => '',
'contactId' => '8',
'wt' => '00:00:00',
'ts' => 'OFF',
'smtl' => '',
'ctctCombo' => 'John Hawkins',
'contact' => '8',
'location' => '16',
'priority' => '-2',
'group' => '1',
'status' => '2',
'category' => '5',
'categoryOption' => '8',
'estimatedDate' => '',
'assignedTo' => '16',
'asset' => '',
'zenAsset' => '',
'cf_20_new' => '512',
'subject' => 'Subject',
'cc' => '',
'bc' => '',
'note' => 'Message',
'attchmnt[0]' => 'filename="";type=application/octet-stream',
'notifyTech' => 'on',
'_notifyTech' => '',
'_notifyUser' => ''
);
?>
所以问题是,如何让CURL在name =“attchmnt [0]”的同一行添加'filename =“”; type = application / octet-stream'; ?
如果我只能上传文件会很简单,但我需要指定它是一个文件流,只是没有上传文件。
答案 0 :(得分:2)
我担心没有干净这样做的方法。您可以使用@语法上传现有文件(然后cURL指定octet-stream
并使用您在filename
中提供的文件名。但是您不能指定为空 filename那样。
你可以这样做......对你自己的代码进行多线注入攻击。 cURL似乎并不介意,但我不知道它是否是设计,允许你做肮脏的行为,或者它是意外和可能会在下一个版本中停止工作:
$dataArray['attchmnt[0]"; filename=""'."\r\n".'Content-Type: octet-stream'] = '';
这转换为:
0x0a30: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ----------------
0x0a40: 2d2d 2d2d 2d2d 2d2d 2d2d 2d33 6331 3837 -----------3c187
0x0a50: 3162 6630 3132 360d 0a43 6f6e 7465 6e74 1bf0126..Content
0x0a60: 2d44 6973 706f 7369 7469 6f6e 3a20 666f -Disposition:.fo
0x0a70: 726d 2d64 6174 613b 206e 616d 653d 2261 rm-data;.name="a
0x0a80: 7474 6368 6d6e 745b 305d 223b 2066 696c ttchmnt[0]";.fil
0x0a90: 656e 616d 653d 2222 0d0a 436f 6e74 656e ename=""..Conten
0x0aa0: 742d 5479 7065 3a20 6f63 7465 742d 7374 t-Type:.octet-st
0x0ab0: 7265 616d 220d 0a0d 0a0d 0a2d 2d2d 2d2d ream"......-----
0x0ac0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ----------------
0x0ad0: 2d2d 2d2d 2d2d 2d2d 2d33 6331 3837 3162 ---------3c1871b
0x0ae0: 6630 3132 362d 2d0d 0a f0126--..
应该是你所追求的。
// $dataArray as defined by you
// Change the 'attchmnt[0]' entry
$dataArray['attchmnt[0]"; filename=""'."\r\n".'Content-Type: octet-stream'] = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, False);
curl_setopt($ch, CURLOPT_VERBOSE, False);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1/');
curl_setopt($ch, CURLOPT_POST, True);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataArray);
curl_exec($ch);