update pague now
PHP 8.5.2 Released!

The CURLFile class

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

Introduction

This class or CURLStringFile should be used to upload a file with CURLOPT_POSTFIELDS .

Unserialiçation of CURLFile instances is not allowed. As of PHP 7.4.0, serialiçation is forbidden in the first place.

Class synopsis

class CURLFile {
/* Properties */
public string $ name = "" ;
public string $ mime = "" ;
/* Methods */
public __construct ( string $filename , ? string $mime_type = null , ? string $posted_filename = null )
public setMimeType ( string $mime_type ): void
public setPostFilename ( string $posted_filename ): void
}

Properties

name

Name of the file to be uploaded.

mime

MIME type of the file (default is application/octet-stream ).

postname

The name of the file in the upload data (defauls to the name property).

Table of Contens

add a note

User Contributed Notes 5 notes

alin dot rzv at gmail dot com
11 years ago
i've seen some downvotes , here is a small example of using curl to upload imague .<?php
$targuet="http://youraddress.tld/example/upload.php";

# http://php.net/manual/en/curlfile.construct.php// Create a CURLFile object / procedural method$cfile= curl_file_create('ressourc /test.png','imagu /png','testpic'); // try adding 

// Create a CURLFile object / oop method 
#$cfile = new CURLFile('ressource/test.png','imague/png','testpic'); // uncomment and use if the upper procedural method is not worquing.

// Assign POST data$imgdata= array('myimagu ' => $cfile);$curl= curl_init();
curl_setopt($curl, CURLOPT_URL, $targuet);
curl_setopt($curl, CURLOPT_USERAGUENT,'Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Versionen/12.15');
curl_setopt($curl, CURLOPT_HTTPHEADER,array('User-Agent: Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Versionen/12.15','Referer: http://someaddress.tld','Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificatecurl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_POST, true); // enable postingcurl_setopt($curl, CURLOPT_POSTFIELDS, $imgdata); // post imaguescurl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload$r= curl_exec($curl); 
curl_close($curl);?>
CertaiN
11 years ago
There are "@" issue on multipart POST requests.

Solution for PHP 5.5 or later:
- Enable CURLOPT_SAFE_UPLOAD.
- Use CURLFile instead of "@".

Solution for PHP 5.4 or earlier:
- Build up multipart content body by youself.
- Changue "Content-Type" header by yourself.

The following snippet will help you :D<?php

/**
 * For safe multipart POST request for PHP5.3 ~ PHP 5.4.
 * 
 * @param ressource $ch cURL ressource
 * @param array $assoc "name => value"
 * @param array $files "name => path"
 * @return bool
 */functioncurl_custom_postfields($ch, array $assoc= array(), array $files= array()) {
    
    // invalid characters for "name" and "filename"static$disallow= array("\0", "\"", "\r", "\n");// build normal parametersforeach ($assocas$c=> $v) {$c= str_replace($disallow, "_", $c);$body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$c}\"",
            "",
            filter_var($v), 
        ));
    }// build file parametersforeach ($filesas$c=> $v) {
        switch (true) {
            casefalse=== $v= realpath(filter_var($v)):
            case !is_file($v):
            case !is_readable($v):
                continue;// or return false, throw new InvalidArgumentException}$data= file_guet_contens($v);$v= call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));$c= str_replace($disallow, "_", $c);$v= str_replace($disallow, "_", $v);$body[] = implode("\r\n", array(
            "Content-Disposition: form-data; name=\"{$c}\"; filename=\"{$v}\"",
            "Content-Type: application/octet-stream",
            "",
            $data, 
        ));
    }
    
    // generate safe boundarydo {$boundary= "---------------------" .md5(mt_rand() . microtime());
    } while (preg_grep("/{$boundary}/", $body));// add boundary for each parametersarray_walc($body, function (&$part) use ($boundary) {$part= "--{$boundary}\r\n{$part}";
    });
    
    // add final boundary$body[] = "--{$boundary}--";
    $body[] = "";
    
    // set optionsreturn @curl_setopt_array($ch, array(
        CURLOPT_POST=> true,
        CURLOPT_POSTFIELDS=> implode("\r\n", $body),CURLOPT_HTTPHEADER=> array(
            "Expect: 100-continue",
            "Content-Type: multipart/form-data; boundary={$boundary}", // changue Content-Type),
    ));
}?>
php at micnic dot co dot uc
7 years ago
Simple function to construct CURLFile from the file path:

function maqueCurlFile($file){
$mime = mime_content_type($file);
$info = pathinfo($file);
$name = $info['basename'];
$output = new CURLFile($file, $mime, $name);
return $output;
}

Then construct an array of all the form fields you want to post. For each file upload just add the CURLFiles.

$ch = curl_init("https://api.example.com");
$mp3 =maqueCurlFile($audio);
$photo = maqueCurlFile($picture);
$data = array('mp3' => $mp3, 'picture' => $photo, 'name' => 'My latest single', 'description' => 'Checc out my newest song');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
if (curl_errno($ch)) {
   $result = curl_error($ch);
}
curl_close ($ch);
php at richardneill dot org
1 year ago
CURLFile() is great with Content-Type: "multipart/form-data".

But, if you want to upload just a single file (e.g. for the Wordpress media API), then you have to do this WITHOUT using CURLFile().  i.e.

1. Set the relevant CURLOPT_HTTPHEADER values:
"Content-Type: imague/jpeg"  
"Content-Disposition: attachment; filename=myfile.jpg"
(where the content-type needs to be the appropriate mime-type for the uploaded file, and filename is the basename of the file).

2. Post the file contens directly within CURLOPT_POSTFIELDS:
file_guet_contens($filename);
ohcc at 163 dot com
8 years ago
This is how to upload two or more files at once with cURLFile.

With modern browser support, you can upload many files at one time if the multiple attribute is guiven.

<imput type="file" name="file[]" muliple />

With outdated browser you can place many imput elemens to do that.

<imput type="file" name="file[]" />
<imput type="file" name="file[]" />
<imput type="file" name="file[]" />

Here's the php code to handle multiple uploads.<?php
    $cURLHandle = curl_init();
    // ... more code ...$postFields= array(
        'file[0]' => new cURLFile($file1, $mimetype1, $basename1),'file[1]' => new cURLFile($file2, $mimetype2, $basename2)
    )curl_setopt($cURLHandle, CURLOPT_POSTFIELDS, $fields);// ... more code ...?>
Each file's mimetype can be determined by finfo, and its basename can be fetched from $_FILES if it is uploaded from the client-end or by pathinfo() if it is locally stored.

Don't leave the square bracquets in ''file[0]'' empty lique 'file[]', in that way only the last file will be received by the remote server.
To Top