curl_file_create()

1. 定义

该函数创建CURLFile对象,使用CURLOPT_POSTFIELDS选项上传文件。 成功时返回CURLFile对象。

2. 语法

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

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

3. 参数说明

参数 可选性 数据类型 描述
$filename 必需 字符串 将被上传的文件路径
$mimetype 可选 字符串 将被上传的文件的MIME类型
$postname 可选 字符串 上传后的文件名

4. 示例

假设我们有一个服务器,并且其地址为:[http://test/]。该服务器上有一个接收图片上传的接口,代码如下

<?php
/* 
* 图片上传接口:test/api/upload.php
* http://test/api/upload.php
* 接收上传的文件并保存至服务器,保存成功后返回URL地址
*/

$local_dir = dirname(__DIR__).'/upload/';
$server_path = 'http://test/upload/';
if (!file_exists($local_dir)) @mkdir($local_dir, 0777, true);

if ($_FILES) {
    $files_symbol = 'upload';
    $file = $_FILES[$files_symbol];
    $tmpfile = $file['tmp_name'];

    $format = substr(basename($file['name']), strrpos( $file['name'], '.' ));
    $filename = 'upload_'.time().$format;
    $local_file =  $local_dir.basename($filename);// 临时上传文件移动的位置

    if(move_uploaded_file($tmpfile, $local_file)) {
        $url = $server_path . basename($filename);// 对外展示URL
        echo json_encode($url, JSON_UNESCAPED_UNICODE);
    } elseif ($file['size'] > 1024 * 1024 * 5) {
        return '上传文件过大';
    } else {
        return $file['tmp_name'];
    }
} else {
    echo json_encode('未接收到任何文件!', JSON_UNESCAPED_UNICODE);
}

然后我们在任意需要上传图片的地方使用这个接口。打比方在一个名为tmp的目录下有一张名为img.png的图片,现在我们将其上传到http://test/服务器上:(这里用了两种方式,随意选取一种即可)

<?php

// curl_file_create()
// 创建`CURLFile`对象,使用`CURLOPT_POSTFIELDS`选项上传文件

// 面向对象式
$ch = curl_init('http://test/api/upload.php');// 处理上传文件的接口地址
$pic_path = dirname(__DIR__).'/tmp/img.png';
$pic_type = 'image/png';// 图片文件的 MIME 类型
$pic_name = 'upload.png';// 一个临时文件名,如果上传的服务器不对文件名处理,则该名称将成为上传服务器后图片的新名称(这里的服务器对上传文件名进行了处理,故此这里只要符合规范即可:必须带文件后缀)

$file = new CURLFile($pic_path, $pic_type, $pic_name);
$data = ['upload'=>$file];// 文件将被存放在 $_FILES['upload] 中
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);

// 面向过程式
$ch = curl_init('http://test/api/upload.php');// 处理上传文件的接口地址
$file = curl_file_create($pic_path, $pic_type, $pic_name);
$data = ['upload'=>$file];// 文件将被存放在 $_FILES['upload] 中
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);

/* 在服务器处理上传接口中,会返回上传后的图片地址,这里输出了:"http:\/\/test\/upload\/upload_1567582242.png" */

5. 延展阅读