PHP cURL - 如何通过HTTP请求将变量的内容作为文件上传?

3

有很多关于“使用PHP Curl上传文件”的答案,它们都要求在机器上存在一个物理文件。通过在POST字段中的文件名前引用@符号进行上传。

然而,我已经在PHP变量“$data”中拥有了文件数据:如何直接上传而不需要先写入文件呢?

我尝试了这个:

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => SERVER_URL . '/test.php?abc=def&ghi=jkl',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_TIMEOUT => 120,
    CURLOPT_POST => 1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => ['file' => $data],
    CURLOPT_HTTPHEADER => ["Content-type: multipart/form-data"],
    CURLOPT_HEADER => true,
    CURLOPT_INFILESIZE => strlen($data)
]);

$response = curl_exec($ch);

但我的服务器出现了一个错误,即POST内容长度超过了8388608字节的服务器限制。然而,在我的服务器上的php.ini文件中,我已经将upload_max_filesize设置为500M。所以看起来这个POST请求没有被视为多部分文件上传,而是试图将所有文件数据压缩到POST请求中。 感谢任何建议。
1个回答

1
你可以先将字符串写入 /tmp 文件夹中。我不确定,但如果你想上传文件,可能需要这样做。文档 中说:

7.0.0 支持禁用 CURLOPT_SAFE_UPLOAD 选项的功能已被删除。所有 curl 文件上传必须使用 CURLFile

编辑:请查看 有关 post_max_size 的文档

post_max_size 整数

设置允许的 POST 数据最大大小。此设置还会影响文件上传。要上传大文件,此值必须大于 upload_max_filesize。一般来说,memory_limit 应该比 post_max_size 大...


1
我知道我可以将数据写入文件...但我想避免这个额外的步骤。如果不可能,我会去做。我只是觉得自己错过了一些显而易见的东西。谢谢。 - Ryan Griggs
@RyanGriggs 尝试将你的 post_max_size 值调整为足够大以容纳该文件(或尝试较小的测试文件),看看它是否起作用。这可能会有所帮助,虽然 php 7.0.0 的“所有 curl 文件上传必须使用 CURLFile”警告似乎对于向前兼容性来说相当不祥。你还可以考虑修改处理上传的脚本,以接受信息字符串。你可能需要对其进行 base64 编码,以确保它能在从 curl 到服务器的传输中存活下来。 - S. Imp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接