【问题标题】:PHP cURL - how to upload contents of a variable as a file via HTTP request?PHP cURL - 如何通过 HTTP 请求将变量的内容作为文件上传?
【发布时间】:2019-06-17 14:30:18
【问题描述】:

“使用 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 Content-Length 超出了服务器限制 8388608 字节。但是,在服务器上的 php.ini 文件中,upload_max_filesize = 500M。所以看起来这个 POST 并没有被视为分段文件上传,而是试图将所有文件数据塞进 POST 请求中。

感谢您的建议。

【问题讨论】:

    标签: php curl post file-upload php-curl


    【解决方案1】:

    您可以先将字符串写入 /tmp 文件夹中的文件。我不确定,但我认为如果你想发布文件,你可能需要这样做。 documentation 说:

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

    编辑:请检查docs on post_max_size

    post_max_size 整数

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

    【讨论】:

    • 我知道我可以将数据写入文件...我试图避免这个额外的步骤。如果不可能,我会去做。我只是觉得我错过了一些明显的东西。谢谢
    • @RyanGriggs 尝试将您的 post_max_size 值调整为足够大以容纳文件(或尝试更小的测试文件)并查看它是否有效。它只是可能——尽管对于 php 7.0.0 的“所有 curl 文件上传必须使用 CURLFile”警告对于前向兼容性来说似乎是相当不祥的。您还可以考虑更改处理上传的脚本以将信息作为字符串接受。您可能希望对其进行 base64 编码,以确保它能够在从 curl 到服务器的传输中幸存下来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多