谁能给我一个PHP的CURLFile类的例子?

luc*_*i5r 34 php upload curl

我有一个非常简单的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);        
Run Code Online (Sandbox Code Playgroud)

服务器正在运行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 ... 
Run Code Online (Sandbox Code Playgroud)

有趣的是,除了基本的类概述之外,php.net上的这个类绝对没有任何意义.没有示例,没有方法或属性的描述.这里基本上是空白的.我知道这是一个全新的课程,几乎没有文档和很少的实际使用,这就是为什么几乎没有任何相关性出现在谷歌搜索或此类Stackoverflow上.

我想知道是否有人使用过这个CURLFile类,可以帮助我或者给我一个例子,在我的代码中使用它代替@filename.

编辑:

我想添加我的"upload.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";
}
Run Code Online (Sandbox Code Playgroud)

最终编辑:

希望为寻找几乎没有记录的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);       
}
?>
Run Code Online (Sandbox Code Playgroud)

upload.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";
} 
Run Code Online (Sandbox Code Playgroud)

Dan*_*ack 49

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)


小智 5

感谢您的帮助,使用您的工作代码,我能够用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, '&');
}
Run Code Online (Sandbox Code Playgroud)

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

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, '&');
}
Run Code Online (Sandbox Code Playgroud)

也许这可以改进解析每个$ param并在值中寻找'@'但是我只为图像做了它因为我需要它.