严格来说 Square API 文档,他们的方法可以在记住一些事情的情况下实现。
-- 您的请求必须包含在边界中,并包含内容处置、名称、文件名、内容类型,如下例所示。
--BOUNDARY
Content-Disposition: form-data; name="image_data"; filename="MyImage.png"
Content-Type: image/png
{BLANK LINE IS REQUIRED}
IMAGE BINARY DATA GOES HERE
--BOUNDARY--
本质上,请求的格式必须与示例中指定的完全相同。这包括“边界”、换行符、必要的标题、标题之间的空白行(由于某种原因,如果该行不存在则不起作用)以及实际的图像二进制数据。注意:边界可以是您选择的任何字符串,但必须始终如一地使用。在代码中,这看起来像这样:
$boundary = "---------------------" . md5(mt_rand() . microtime());
$imageToUpload = "--{$boundary}" . "\r\n" .
"Content-Disposition: form-data; name=\"image_data\"; filename=\"" . $full_path_to_image_file . "\"" . "\r\n" .
"Content-Type: image/jpeg" . "\r\n" .
"\r\n" . // <- empty line is required
(file_get_contents($full_path_to_image_file)) . "\r\n" .
"--{$boundary}--";
以上将产生如下所示的请求:
-----------------------51b62743876b1201aee47ff4b1910e49
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg"
Content-Type: image/jpeg
����
-----------------------51b62743876b1201aee47ff4b1910e49--
-- 从技术上讲,请求中的 Content-Type 必须随着您上传的图像类型(image/jpeg 或 image/png)而变化。您可以将内容类型设置为 application/octet-stream 以涵盖所有基础。
-----------------------51b62743876b1201aee47ff4b1910e49
Content-Disposition: form-data; name="image_data"; filename="/some/directory/image.jpg"
Content-Type: application/octet-stream
����
-----------------------51b62743876b1201aee47ff4b1910e49--
上面的两个示例将上传一张图片。
--“图像二进制数据”可能会产生误导,因为我的每次搜索都表明图像二进制是通过使用 base64_encode 函数获得的。在我的实验中,base64_encoding 没有做任何事情。您只需要使用 file_get_contents 打开文件。
-- 在您的 cURL 请求中,必须将标头的 Content-Type 设置为 multipart/form-data 并且与请求具有相同的边界。下面的例子:
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $personalAccessToken, 'Content-Type: multipart/form-data; boundary=' . $boundary ));
因此,这为混合添加了另一种解决方案。