2015-12-15 88 views
3

我正在修改一个将图像上传到imgur的示例。该示例使用卷曲,我正在使用guzzle^6.1。与卷曲的例子是:将cURL转换为Guzzle POST

<html> 
    <h3>Form</h3> 
    <form method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="50000" /> 
    Image (< 50kb): <input type="file" name="upload" /><br/> 
    ClientID: <input type="text" name="clientid" /><br/> 
    <input type="submit" value="Upload to Imgur" /> 
    </form> 
</html> 
<?php 

if (empty($_POST['clientid']) || @$_FILES['upload']['error'] !== 0 || @$_FILES['upload']['size'] > 50000) { 
    exit; 
} 

$client_id = $_POST['clientid']; 

$filetype = explode('/',mime_content_type($_FILES['upload']['tmp_name'])); 
if ($filetype[0] !== 'image') { 
    die('Invalid image type'); 
} 

$image = file_get_contents($_FILES['upload']['tmp_name']); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json'); 
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id)); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image))); 

$reply = curl_exec($ch); 

curl_close($ch); 

$reply = json_decode($reply); 

echo "<h3>Image</h3>"; 
printf('<img height="180" src="%s" >', @$reply->data->link); 

echo "<h3>API Debug</h3><pre>"; 
var_dump($reply); 

我尝试转换使用下面的代码狂饮:

use GuzzleHttp\Client; 
use GuzzleHttp\Psr7\Request as gRequest; 
//....Clases and functions ... 

     $url = "https://api.imgur.com/3/image.json"; 
     $client_id = "miclientid";    
     $client = new Client([ 
      // Base URI is used with relative requests 
      'base_uri' => $url, 
      // You can set any number of default request options. 
      'timeout' => 15.0, 
     ]);  
     $gRequest = new gRequest('POST', 'https://api.imgur.com/3/image.json', [ 
         'headers' => [ 
          'Authorization: Client-ID' => $client_id 
         ], 
         'image' => "data:image/png;base64,iVBORw0K..." 

     ]); 

     $gResponse = $client->send($gRequest, ['timeout' => 2]); 

但是我收到一个400错误的请求;我的代码有什么问题?

回答

4

第一眼,我看到了两个问题:

  1. Authorization头。在您的Guzzle版本中,您使用Authorization: Client-ID作为标头名称$client_id作为标头值。这将产生一个(错误)的HTTP头,看起来像这样:

    Authorization: Client-ID: myclientid 
    

    解决方案:通过你的标题是这样的:

    "headers" => [ 
        "authorization" => "Client-ID " . $clientId 
    ] 
    
  2. 的请求主体。您的原始基于cURL的版本包含一个带有image参数的URL查询编码主体。该参数包含图像文件的base64编码原始内容。在您的Guzzle版本中,由于您使用的是不存在的image选项(请查看Guzzle documentation以获取所有支持选项的列表),因此您实际上不会发送任何物体。此外,您的原始示例不包含data:image/png;base64,前缀(通常只是浏览器的提示)。

    尝试传递参数如下:

    "form_params" => [ 
        "image" => base64_encode(/* image content here */) 
    ]