gpt4 book ai didi

php - CURL:将带有边界的图像发送到 REST API

转载 作者:搜寻专家 更新时间:2023-10-31 21:00:22 24 4
gpt4 key购买 nike

我目前正在使用某种 API。我已经编写了允许我添加新内容的简单函数,但是我坚持上传图片。

这是文档中的简单 CURL 命令:

curl -v -s -u username:password \
-H "Content-Type: multipart/form-data" \
-H "Accept: application/api+json" \
-F "image=@img1.jpeg;type=image/jpeg" \
-F "image=@img2.jpeg;type=image/jpeg" \
-XPUT ''

和一个示例请求:

PUT /images HTTP/1.1
Host: example
Content-Type: multipart/form-data; boundary=vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx

--vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx
Content-Disposition: form-data; name="image"; filename="img1.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary

现在,我的功能是:

$headers_put = array( 
"Content-Type: multipart/form-data; boundary=vjrLeiXjJaWiU0JzZkUPO1rMcE2HQ-n7XsSx",
"Accept: application/+json",
);

function putImages($ch, $headers, $ad, $images){
$url = '/images';

$files = [];

foreach($images as $key => $image) {
$number = $key +1;
$paths = parse_url($image, PHP_URL_PATH);
$paths = $_SERVER['DOCUMENT_ROOT'] . $paths;

$cfile = new CURLFile(''. $paths, 'image/jpeg', 'image'.$key);
$files[$key] = $cfile;

}

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);

$result = curl_exec($ch);
var_dump($result);

echo curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "\n";

}

最后的响应是:

{"errors":{"error":{"@key":"unsupported-form-element"}}}"

我做错了什么?有任何想法吗?非常感谢您的帮助。

最佳答案

在使用 curl_file_create 的几种方法之后却没有让它工作。我认为 mobile.de-API 的实现很糟糕。

我最终为 CURLOPT_POSTFIELDS 实现了一个自定义例程,该例程手动创建了完整的多部分。我从 PHP 联机帮助页中借用了大部分代码作为“CURLFile 类”。

  1. 创建文件名数组
  2. 创建多部分标题(见下面的代码)

    function curl_custom_postfields(array $files = array())    {

    // build file parameters
    foreach ($files as $k => $v) {
    switch (true) {
    case false === $v = realpath(filter_var($v)):
    case !is_file($v):
    case !is_readable($v):
    continue; // or return false, throw new InvalidArgumentException
    }
    $data = file_get_contents($v);
    $body[] = implode("\r\n", array(
    "Content-Disposition: form-data; name=\"image\"",
    "Content-Type: image/jpeg",
    "",
    $data,
    ));
    }

    // generate safe boundary
    do {
    $boundary = "---------------------" . md5(mt_rand() . microtime());
    } while (preg_grep("/{$boundary}/", $body));

    // add boundary for each parameters
    array_walk($body, function (&$part) use ($boundary) {
    $part = "--{$boundary}\r\n{$part}";
    });

    // add final boundary
    $body[] = "--{$boundary}--";
    $body[] = "";

    // set options
    return array(implode("\r\n", $body), $boundary);
    }
  3. 使用那个函数 ;)

    $postfields = $this->curl_custom_postfields($files);
  4. 给http头添加边界

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; boundary=' . $postfields[1], 'Accept: application/vnd.de.mobile.api+json'));
  5. 添加后域

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields[0]);

这根本不是最干净的解决方案,所以请小心使用。但至少它有效。

关于php - CURL:将带有边界的图像发送到 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44431824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com