如何使用 PHP Curl 将文件上传到 AWS 预签名 URL?

2024-01-01

我正在尝试使用 PHP Curl 通过预签名 URL 将文件从“

...”上传到 AWS。

虽然文件似乎已成功上传,但在下载最近上传的文件后,尝试打开新下载的文件失败。根据文件类型,我收到“此文件已损坏”或“看起来我们不支持此文件格式”或“我们无法打开此文件”。我在上传时没有通过curl_exec 或curl_error 从AWS 得到任何响应。

我基本上从 POSTMAN 复制了 PHP 代码,因为当文件作为“二进制”附加时,POSTMAN 成功上传文件。由于我的代码通过 CURLOPT_POSTFIELDS 在我的代码中附加文件,这可能是一个问题吗?我见过的所有其他示例都是通过curl_file_create 和CURLOPT_POSTFIELDS 附加文件,所以这就是我正在使用的。

我上传文件的唯一说明是:

curl -X PUT \
  "https://PRESIGNED_PUT_URL_FROM_RESPONSE" \
  --upload-file ~/Documents/Files/the_file.pdf

我尝试将标头中的内容类型更改为实际上传的文件类型,但都不起作用。我尝试过 CURLFile 和curl_file_create。上传到我的测试服务器和网站服务器后的文件在上传到 AWS 之前仍然有效。

    $file_name = $post_files[$FILES_file]["name"];
    $content_type = $post_files[$FILES_file]["type"];
    $TheFileSize = $post_files[$FILES_file]["size"];
    $tmp_name = $post_files[$FILES_file]["tmp_name"];
    $curl = curl_init();
    $cFile = curl_file_create($tmp_name, $content_type, $file_name);

    $payload = array('upload-file' => $cFile);

    $curlOptions = array(
            CURLOPT_URL            => $TheAWSPresignedURL,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_CUSTOMREQUEST  => "PUT",
            CURLOPT_ENCODING       => "",
            CURLOPT_POST           => 1,
            CURLOPT_MAXREDIRS      => 10,
            CURLOPT_TIMEOUT        => 300,
            CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
            CURLOPT_INFILESIZE     => $TheFileSize,
            CURLOPT_HTTPHEADER     => array(
                "Accept: */*",
                "Accept-Encoding: gzip, deflate",
                "Cache-Control: no-cache",
                "Connection: keep-alive",
                "Content-Length: ".$TheFileSize,
                "Content-Type: multipart/form-data",
                "Host: s3.amazonaws.com"
            ),
        );
    curl_setopt_array($curl, $curlOptions);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);  
    $response = curl_exec($curl);

我正在寻找通过预签名 URL 成功上传到 AWS、成功下载并成功打开的文件。

[UPDATE]

尝试上传文本文件而不是图像和 pdf,这是我们开发的主要文件类型。下载这些文件最终“成功”,因为我能够打开它们,但是,文本文件的开头添加了文本。

如果作为 Content-Type:multipart/form-data 上传,该文件仍然可以下载,但打开它时,此文本会添加到文件的开头。

--------------------------9cd644e15677104b Content-Disposition: form-data; name="upload-file"; filename="SimpleTextFile.txt" Content-Type: text/plain

如果以 Content-Type: $content_type 上传,则下载链接会在新的浏览器窗口中打开文件,并将此文本添加到文件中。

--------------------------3dca3db029b41ae2 Content-Disposition: attachment; name="upload-file"; filename="SimpleTextFile2.txt" Content-Type: text/plain


更换$payload = array('upload-file' => $cFile); with $payload = file_get_contents( $tmp_name );解决了我的问题。看来我不需要curl_file_create或数组和键upload-file根本不。

Also, https://stackoverflow.com/a/21888136 https://stackoverflow.com/a/21888136提到直接加载内容应该删除标题信息,确实如此。

感谢大家的见解,因为你们确实为我指明了正确的方向!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PHP Curl 将文件上传到 AWS 预签名 URL? 的相关文章