CURLFile::__construct

curl_file_create

(PHP 5 >= 5.5.0, PHP 7)

CURLFile::__construct -- curl_file_createCreate a CURLFile object

Опис

Об'єктно-орієнтований стиль

public CURLFile::__construct ( string $filename [, string $mimetype [, string $postname ]] )

Процедурний стиль

CURLFile curl_file_create ( string $filename [, string $mimetype [, string $postname ]] )

Creates a CURLFile object, used to upload a file with CURLOPT_POSTFIELDS.

Параметри

filename

Path to the file which will be uploaded.

mimetype

Mimetype of the file.

postname

Name of the file to be used in the upload data.

Значення, що повертаються

Returns a CURLFile object.

Приклади

Приклад #1 CURLFile::__construct() example

Об'єктно-орієнтований стиль

<?php
/* http://example.com/upload.php:
<?php var_dump($_FILES); ?>
*/

// Create a cURL handle
$ch curl_init('http://example.com/upload.php');

// Create a CURLFile object
$cfile = new CURLFile('cats.jpg','image/jpeg','test_name');

// Assign POST data
$data = array('test_file' => $cfile);
curl_setopt($chCURLOPT_POST,1);
curl_setopt($chCURLOPT_POSTFIELDS$data);

// Execute the handle
curl_exec($ch);
?>

Процедурний стиль

<?php
/* http://example.com/upload.php:
<?php var_dump($_FILES); ?>
*/

// Create a cURL handle
$ch curl_init('http://example.com/upload.php');

// Create a CURLFile object
$cfile curl_file_create('cats.jpg','image/jpeg','test_name');

// Assign POST data
$data = array('test_file' => $cfile);
curl_setopt($chCURLOPT_POST,1);
curl_setopt($chCURLOPT_POSTFIELDS$data);

// Execute the handle
curl_exec($ch);
?>

Наведений вище приклад виведе:

array(1) {
  ["test_file"]=>
  array(5) {
    ["name"]=>
    string(9) "test_name"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/phpPC9Kbx"
    ["error"]=>
    int(0)
    ["size"]=>
    int(46334)
  }
}

Прогляньте Також

add a note add a note

User Contributed Notes 2 notes

up
6
CertaiN
8 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.
- Change "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 resource $ch cURL resource
* @param array $assoc "name => value"
* @param array $files "name => path"
* @return bool
*/
function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) {
   
   
// invalid characters for "name" and "filename"
   
static $disallow = array("\0", "\"", "\r", "\n");
   
   
// build normal parameters
   
foreach ($assoc as $k => $v) {
       
$k = str_replace($disallow, "_", $k);
       
$body[] = implode("\r\n", array(
           
"Content-Disposition: form-data; name=\"{$k}\"",
           
"",
           
filter_var($v),
        ));
    }
   
   
// build file parameters
   
foreach ($files as $k => $v) {
        switch (
true) {
            case
false === $v = realpath(filter_var($v)):
            case !
is_file($v):
            case !
is_readable($v):
                continue;
// or return false, throw new InvalidArgumentException
       
}
       
$data = file_get_contents($v);
       
$v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v));
       
$k = str_replace($disallow, "_", $k);
       
$v = str_replace($disallow, "_", $v);
       
$body[] = implode("\r\n", array(
           
"Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"",
           
"Content-Type: application/octet-stream",
           
"",
           
$data,
        ));
    }
   
   
// generate safe boundary
   
do {
       
$boundary = "---------------------" . md5(mt_rand() . microtime());
    } while (
preg_grep("/{$boundary}/", $body));
   
   
// add boundary for each parameters
   
array_walk($body, function (&$part) use ($boundary) {
       
$part = "--{$boundary}\r\n{$part}";
    });
   
   
// add final boundary
   
$body[] = "--{$boundary}--";
   
$body[] = "";
   
   
// set options
   
return @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}", // change Content-Type
       
),
    ));
}

?>
up
0
mipa
8 years ago
For PHP < 5.5:

<?php

if (!function_exists('curl_file_create')) {
    function
curl_file_create($filename, $mimetype = '', $postname = '') {
        return
"@$filename;filename="
           
. ($postname ?: basename($filename))
            . (
$mimetype ? ";type=$mimetype" : '');
    }
}

?>
To Top