简体   繁体   中英

Posting file with curl as a string

I'm trying to upload a file using curl and php with the following code. I'm passing post data as a string using http_build_query rather than an array because post data is a multi part array. Code works except I can't get image to upload.

$ch = curl_init();
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);

$image=file_get_contents(realpath('image.jpg'));
    $postFields = array(
         'authenticity_token'=>$token1.'=',
         'menu_item'=>array('name'   => $name,
         'body'=>'',
         'published'=>0,
         'published'=>1,
         'picture'=>$image,
    );


        $postData=http_build_query($postFields);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_exec ($ch);

First of all make sure what you want to do. If you want to do normal form posting then remove this below header from your code, and it should work.

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));

Now, if you want to do a multipart/form-data posting through curl, then do this:

$postFields = array(
     'authenticity_token'=>$token1.'=',
     'menu_item'=>array('name'   => $name,
     'body'=>'',
     'published'=>0,
     'published'=>1,
     'picture'=> '@' . $image, // better to use path like 'c:/temp/image.jpg'
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);

Could not accomplish this using http_build_query on my multi-dimensional post array... the file will not be uploaded by the server. Had to create the array with the nested part as http does...

    $postFields['authenticity_token'=$token1.'=';
    $postFields['menu_item[name]']=$name;        
    $postFields['menu_item[body]']='';
    $postFields['menu_item[published]']=0;
    $postFields['menu_item[published]']=1;
    $postFields['menu_item[picture]']='@'.$image;

curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM