1

从最近几天开始,我在 php 中开发 CURL 请求以将文件数据发布到 API 时遇到了这个问题。

这是 CURL 请求

$ curl --request POST \
    --url 'UPLOAD_URL' \
    --upload-file 'PATH_TO_FILE' \
    --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'

对于 PATH_TO_FILE,我已经尝试了通过网络和 stackoverflow 发布的每一种方法。

这是我的 PHP 代码

<?php
header('Content-Type: application/json');
$sheader = array('Authorization: Bearer '.$_SESSION['access_token']);
$filename = $_FILES['upload-file']['name'];
$filedata = $_FILES['upload-file']['tmp_name'];
$filesize = $_FILES['upload-file']['size'];
$filetype = $_FILES['upload-file']['type'];

if($filename != '')
{
 $ch = curl_init();
 $cFile = new CURLFile(realpath($filename), $filetype, 'harish.jpg');
 //$cFile = '@'. realpath($filename);
 $data = array('upload-file' => $cFile); 
 curl_setopt($ch, CURLOPT_POSTFIELDS, $cFile);
 //curl_setopt($ch, CURLOPT_POSTFIELDS, realpath($filename));
 curl_setopt($ch, CURLOPT_URL, $_POST['upload_url']);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $sheader);
 curl_exec($ch);
 echo json_encode($ch);
 //echo json_encode(array('filename'=>$filename, 'temp_path'=>$filedata, 'basepath'=>realpath($filename)));

 } else {
    echo 'There is no file selected';
 }

我在网上找到的大多数解决方案是下面提到的这两个

方法 1(对于 php < 5.5)

'@'.$filepath

方法 2(对于 php > 5.5)

CURLFile($filename, $filetype, 'somefile.jpg');

或者

curl_file_create($filedata, 'image/jpeg', $filename);

以上都不适合我。我在 CURLFile 中也使用 realpath($filename) 来获取文件的绝对路径,但遗憾的是这也不起作用。

4

1 回答 1

1

我承认CURLFile文档有点模棱两可,但第一个构造函数参数$name实际上是您要发送的实际文件的物理路径,而不是“友好”名称(在可选的第三个参数中$postname)。你应该注意到有什么问题,因为你从来没有告诉过$_FILES['upload-file']['tmp_name']Curl——它无法知道你想发送什么文件。

所以:

$filename = $_FILES['upload-file']['name'];
$filedata = $_FILES['upload-file']['tmp_name'];
$filesize = $_FILES['upload-file']['size'];
$filetype = $_FILES['upload-file']['type'];

$cFile = new CURLFile($filedata, $filetype, 'harish.jpg')

由于您正在跳过错误检查,因此您没有收到有关此信息的通知。您不会检查任何函数的返回值,也不会在代码中的任何位置调用curl_error() 。

您还有一个错误是您以CURLFile这种方式传递实例:

curl_setopt($ch, CURLOPT_POSTFIELDS, $cFile);

正确的语法应该是这样的:

curl_setopt($ch, CURLOPT_POSTFIELDS, ['give_a_nice_post_name_here' => $cFile]);
于 2017-06-01T08:43:03.940 回答