我正在尝试使用 PHP Curl 通过预签名 URL 将文件从“
虽然文件似乎已成功上传,但在下载最近上传的文件后,尝试打开新下载的文件失败。根据文件类型,我收到“此文件已损坏”或“看起来我们不支持此文件格式”或“我们无法打开此文件”。我在上传时没有通过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