任何人都可以给我一个PHP的CURLFile类的例子吗?

2022-08-30 11:33:22

我有一个非常简单的PHP代码将文件上传到远程服务器;我这样做的方式(正如其他一些解决方案中所建议的那样)是使用cUrl上传文件。

这是我的代码:

$ch = curl_init("http://www.remotesite.com/upload.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['Filedata']['tmp_name'])); 
echo curl_exec($ch);        

服务器正在运行 PHP 5.5.0,并且似乎@filename在 PHP >= 5.5.0 中已被弃用,如描述中所述,因此,我收到此错误:CURLOPT_POSTFIELDS

Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in ... 

有趣的是,除了基本的类概述之外,php.net 的这个类绝对没有任何内容。没有示例,没有方法或属性的描述。这里基本上是空白的。我知道这是一个全新的类,几乎没有文档,也很少在现实世界中使用,这就是为什么在Google上的搜索中或Stackoverflow上的这个类上几乎没有出现任何相关的东西。

我想知道是否有人使用过这个 CURLFile 类,并且可能帮助我,或者给我一个示例,说明如何使用它来代替代码中的@filename。

编辑:

我还想添加我的“上传.php”代码;此代码将与传统的@filename方法一起使用,但不再使用 CURLFile 类代码:

$folder = "try/";
$path = $folder . basename( $_FILES['file']['tmp_name']); 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['tmp_name']). " has been uploaded";
}

最终编辑

想要为其他人添加最终/工作代码,寻找几乎没有文档记录的CURLFile类的类似工作示例...

curl.php(本地服务器)

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label> <input type="file" name="Filedata" id="Filedata" /> 
<br />
<input type="submit" name="submit" value="Submit" />
</form>

<?php
if ($_POST['submit']) {
    $uploadDir = "/uploads/";
    $RealTitleID = $_FILES['Filedata']['name'];
    $ch = curl_init("http://www.remotesite.com/upload.php"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
    $result = curl_exec($ch);       
}
?>

上载.php(远程服务器)

$folder = "try/";
$path = $folder . $_FILES['file']['name']; 
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
echo "The file ".  basename( $_FILES['file']['name']). " has been uploaded";
} 

答案 1

RFC 上有一个代码片段:https://wiki.php.net/rfc/curl-file-upload

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = new CurlFile('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

如果您害怕创建对象,也可以使用看似毫无意义的功能。curl_file_create( string $filename [, string $mimetype [, string $postname ]] )

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = curl_file_create('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

答案 2

感谢您的帮助,使用您的工作代码,我能够通过php 5.5和Facebook SDK解决我的问题。我从 sdk 类中的代码中收到此错误。

我不认为这算作回应,但我确信有人像我一样搜索与Facebook SDK和php 5.5相关的错误。

如果有人遇到同样的问题,我的解决方案是将base_facebook.php的一些代码更改为使用CurlFile类而不是@filename。

由于我从几个地方调用 sdk,因此我只是修改了几行 sdk:

在名为“makeRequest”的方法中,我进行了以下更改:

在代码的这一部分中:

if ($this->getFileUploadSupport()){
    $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

将第一部分(启用文件上传)更改为:

if ($this->getFileUploadSupport()){
  if(!empty($params['source'])){
     $nameArr = explode('/', $params['source']);
     $name    = $nameArr[count($nameArr)-1]; 
     $source  = str_replace('@', '', $params['source']);
     $size    = getimagesize($source); 
     $mime    = $size['mime'];
     $params['source'] = new CurlFile($source,$mime,$name);
  }

  if(!empty($params['image'])){
     $nameArr = explode('/', $params['image']);
     $name    = $nameArr[count($nameArr)-1]; 
     $image   = str_replace('@', '', $params['image']);
     $size    = getimagesize($image); 
     $mime    = $size['mime'];
     $params['image'] = new CurlFile($image,$mime,$name);
  }
  $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

也许这可以改进解析每个$param并在值中查找“@”。但我这样做只是为了来源图像,因为这是我需要的。


推荐