Hello,
I'm trying to POST a file using CURL in PHP.
I've managed to log in the the web site and move through the pages, it saves the cookies and deals with SSL, etc. All this works, but when it comes to uploading a file then it's just not working.
This is what I'm using, the following appears to post the file but it is not accepted by the server on the other side:
[CODE]
<?php
$fields = array (
'field1' => "@$screen1",
'field2' => 'Upload Primary Screenshot',
);
$ch = curl_init($useform);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $userefer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close ($ch);
?>
[/CODE]
This does work, without an upload, and it accepted by the server:
[CODE]
<?php
$fields = http_build_query(array (
'field1' => 'Some normal text',
'field2' => '123456',
));
$ch = curl_init($useform);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $userefer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close ($ch);
?>
[/CODE]
This does not work, it is not accepted by the server:
[CODE]
<?php
$fields = array (
'field1' => 'Some normal text',
'field2' => '123456',
);
$ch = curl_init($useform);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $userefer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close ($ch);
?>
[/CODE]
So you would expect the following to work, but it does not, I assume because the http_build_query function somehow destroys the array containing the file:
[CODE]
<?php
$fields = http_build_query(array (
'field1' => "@$screen1",
'field2' => 'Upload Primary Screenshot',
));
$ch = curl_init($useform);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $userefer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
curl_close ($ch);
?>
[/CODE]
I used HttpWatch to monitor exactly what is send when I fill in the form manually, and this is it:
--------------------------
---7d92c83
10076c
Content-Disposition: form-data; name="field1"; filename="test.jpg"
Content-Type: image/pjpeg
(The image data here)
The server is very strict in the way the POST data is received, so I need to duplicate the browser post exactly. I thought CURL would do that and I don't understand why it does not work.
Please help me work out what the problem is, I've been working on this for days!