php 通过curl上传图片

通过curl上传图片

  • PHP < 5.5:
    使用 目前使用的php版本 7.1 测试无法使用 前面加@ 的方法上传文件 ,查找资料 使用 curl_setopt($ch,CURLOPT_SAFE_UPLOAD,FALSE) 可以解决,但是经测试 这种方式不行,显示的CURLOPT_SAFE_UPLOAD这个选项在该版本php中已经被废弃

  • 可以通过检测 有没有 curl_file_create 这个函数 也可以检测 有没有类\CURLFile class_exists('\CURLFile')

$filename = new \CURLFile(realpath($filepath),$minetype,$basename);
或者
$filename = curl_file_create(realpath($filepath),$minetype,$basename);

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

$ch = curl_init();
$filename = 'C:/Users/shanghai/Pictures/Camera Roll/23.jpg';
$minetype = 'image/jpeg';
$curl_file = curl_file_create($filename,$minetype);
$postData = [
    'file' => '111',
    'text' => '666',
    'file_name'=>$curl_file ,
];


curl_setopt($ch, CURLOPT_URL, 'xxx.com/test/curl');
//curl结果不直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//发送post  请求
curl_setopt($ch, CURLOPT_POST, 1);
// urlencoded 后的字符串,类似'para1=val1&para2=val2&...',也可以使用一个以字段名为键值,字段数据为值的数组 ,测试当值为数组时候  Content-Type头将会被设置成multipart/form-data 否则Content-Type 头会设置为 application/x-www-form-urlencoded 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
//curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

//允许 cURL 函数执行的最长秒数
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
//不输出header 头信息
curl_setopt($ch, CURLOPT_HEADER,0);
//不验证证书 信任任何证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 检查证书中是否设置域名,0不验证 0:不检查通用名称(CN)属性
1:检查通用名称属性是否存在
2:检查通用名称是否存在,是否与服务器的主机名称匹配
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//设置 在HTTP请求中包含一个"User-Agent: "头的字符串
//curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);


$res = curl_exec($ch);
$error_no = curl_errno($ch);
$info = curl_getinfo($ch);
$err_msg = '';
if ($error_no) {
    $err_msg = curl_error($ch);
} else {
    print_r($res);
    dump($info);
}
curl_close($ch);

注意:

  • curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $postData为数组时Content-Type 头部会被设置为 multipart/form-data ,通过file_get_contents('php://input')获取不到post提交的到数据,通过$_POST 可以,$_FILES 可以获取数据

image

$ch = curl_init();
$curl_file1 = curl_file_create('C:/Users/shanghai/Pictures/Camera Roll/23.jpg', 'image/png', pathinfo('C:/Users/shanghai/Pictures/Camera Roll/23.jpg',PATHINFO_BASENAME));
$curl_file2 = curl_file_create('C:/Users/shanghai/Pictures/Camera Roll/66tyr.jpg', 'image/png', pathinfo('C:/Users/shanghai/Pictures/Camera Roll/66tyr.jpg',PATHINFO_BASENAME));

$postData = [
    'file' => '111',
    'text' => '666',
    'file_name[0]'=>$curl_file1,
    'file_name[1]'=>$curl_file2,
    // 'file_name'=>$curl_file1 ,
];
curl_setopt($ch, CURLOPT_URL, 'xxx.com/test/curl');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, 1);
// curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($postData));
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);


$res = curl_exec($ch);
$error_no = curl_errno($ch);
$info = curl_getinfo($ch);
$err_msg = '';
if ($error_no) {
    $err_msg = curl_error($ch);
} else {
    print_r($res);
    // dump($info);
}
curl_close($ch);


public function actionCurl()
{
    $request = Yii::$app->request;
    dump(file_get_contents('php://input'),$_FILES,$request->post(),$request->getContentType(),$request->getMethod());
}
  • curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); 这个参数值为urlencoded 后的字符串,类似'para1=val1&para2=val2&...'Content-Type 头部会被设置为 application/x-www-form-urlencoded ,通过file_get_contents('php://input')可以获取到post提交的到数据,通过$_POST 也可以,$_FILES 获取不到数据
    image

  • 传递json参数

    $jsonData = '{"name":"xp","age":"18","sex":"男"}';
    $postData = [
    'file' => '111',
    'text' => '666',
       'file_name[0]'=>$curl_file1,
       'file_name[1]'=>$curl_file2,
    // 'file_name'=>$curl_file1 ,
    ];
    $header = [
       'Content-Type: application/json',
       'Content-Length:'.strlen($jsonData),
    ];
    curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
    // 设置Content-Type: application/json,传递数组数据时, 都获取不到数据,文件也获取不到
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    //当不设置header 时 
    curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
  1. 设置Content-Type: application/json,传递json数据参数时,file_get_contents('php://input')可以获取到数据,其他获取不到
    image

  2. 不设置Content-Type: application/json,传递json数据参数时,传递file_get_contents('php://input')可以获取到数据,$_FILES获取不到 ,$_POST 获取到的是["{"name":"xp","age":"18","sex":"男"}" => ""]
    image

  3. 设置Content-Type: application/json,传递数组参数时,获取不到参数
    image

  • curl 多图上传时 ,传递的数组要加key
//像这样写可以获取到多图
$postData = [
    'file' => '111',
    'text' => '666',
   'file_name[0]'=>$curl_file1,
   'file_name[1]'=>$curl_file2,
    // 'file_name'=>$curl_file1 ,
];

//这样写的话 后面的会覆盖前面的
$postData = [
    'file' => '111',
    'text' => '666',
   'file_name[]'=>$curl_file1,
   'file_name[]'=>$curl_file2,
    // 'file_name'=>$curl_file1 ,
];
  • 只有当 Content-Type:application/x-www-form-urlencoded 时 php://input 和$_POST都有数据;当Content-Type:multipart/form-data 时 php://input 获取不到数据,$_FILES 可以获取上传图片的信息,$_POST也有数据;当Content-Type:application/json 并且传递的是json 数据时 , php://input可以正常获取json 数据,$_POST获取不到;当Content-Type:text/xml php://input可以正常获取xml 数据,$_POST获取不到
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用PHPcurl上传图片,可以按照以下步骤进行操作: 1. 首先,确保服务器上已经安装了curl扩展,并在PHP中启用了该扩展。 2. 创建一个curl资源,并设置必要的选项。你可以使用curl_init函数来创建资源,并使用curl_setopt函数来设置选项。 3. 设置请求的URL。使用curl_setopt函数,并将CURLOPT_URL选项设置为目标URL。 4. 设置请求的方法为POST。使用curl_setopt函数,并将CURLOPT_POST选项设置为true。 5. 设置POST的数据。根据你的需求,可以使用curl_setopt函数,并将CURLOPT_POSTFIELDS选项设置为需要发送的数据。对于上传图片,你可以将图片的路径作为POST数据。 6. 执行curl请求并获取响应。使用curl_exec函数来执行curl请求,并使用curl_getinfo函数来获取请求的相关信息。 7. 关闭curl资源。使用curl_close函数来关闭curl资源。 下面是一个示例代码,演示了如何使用curl上传图片: ```php // 图片文件路径 $imagePath = "/path/to/image.jpg"; // 创建curl资源 $curl = curl_init(); // 设置请求的URL curl_setopt($curl, CURLOPT_URL, "http://example.com/upload.php"); // 设置请求的方法为POST curl_setopt($curl, CURLOPT_POST, true); // 设置POST的数据(图片文件路径) curl_setopt($curl, CURLOPT_POSTFIELDS, [ 'upload' => new CURLFile($imagePath) ]); // 执行curl请求并获取响应 $response = curl_exec($curl); // 获取请求的相关信息 $info = curl_getinfo($curl); // 关闭curl资源 curl_close($curl); // 处理响应结果 if ($response === false) { echo "上传失败"; } else { echo "上传成功"; } ``` 在上述代码中,需要将`http://example.com/upload.php`替换为实际的上传图片的URL。另外,你也可以根据需要设置其他curl选项,例如设置请求头信息、设置超时时间等。<span class="em">1</span> #### 引用[.reference_title] - *1* [php curl 上传图片](https://download.csdn.net/download/h_hanlinglingzi/10726132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值