【问题标题】:Amazon S3 working in production but not from localhostAmazon S3 在生产中工作,但不是来自本地主机
【发布时间】:2021-02-26 04:45:27
【问题描述】:

我无法从本地主机上传到我的 s3 存储桶,尽管它在生产中运行良好。上传过程中没有发现任何错误,但文件从未出现(pdf 和图像都没有)。我没有阻止公共访问(这似乎是大多数人的问题)。

我在这里看到一个人通过在他们的 php 设置中打开 allow_url_fopen 来解决他们的问题。我的已经开机了。

编辑:我应该注意我有一个从 Windows 运行的 python 脚本,它使用存储桶没有任何问题。这让我觉得这与我的 WAMP 服务器设置有关,但我的 php 和 apache 日志都没有显示任何内容,并且设置看起来很好。

还有其他想法吗?

require_once '../../includes/aws/aws-autoloader.php';

$msg = "";

if( isset($_POST['fileUpload']) ) {
    $fileUpload = $_POST['fileUpload'];
    $dirPath = "drives/nota_simple/projects/";
    
    $pdf_parts = explode(";base64,", $fileUpload["pdf"]);
    $pdf_base64 = $pdf_parts[1];

    $s3 = new Aws\S3\S3Client([
        'region'  => 'eu-west-1',
        'version' => '2006-03-01',
        'credentials' => [
            'key'    => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            'secret' => "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        ]
    ]);
    

    $projectFolder = utf8_decode(filter_var($fileUpload['fileProject'], FILTER_SANITIZE_STRING));

    $dirPath .= $projectFolder;
    $dirPath .=  '/' . $fileUpload['fileIdTask'];
    

    $id_image = [taken from DB]
    $key = $dirPath .'/'.$id_image.'.'.$fileUpload['fileExt'];

    try { // Guardamos nota_simple
        $result = $s3->putObject([
            'Bucket' => 'BUCKET_NAME',
            'Key'    => $key,
            'Body'            => base64_decode($pdf_base64),
            'ContentType'     => 'application/' . $fileUpload['fileExt'],
            'ACL'   => 'public-read'
        ]);
    }
    catch(S3Exception $e) {
        echo $e->getMessage() . "\n";
        $msg = "Fallo al subir nota_simple: " . $e->getMessage();
        $response = array("error" => $msg);
    }

    $response = array("success" => "Guardado con suceso.");

【问题讨论】:

  • 能否请您发布用于执行上传的代码?
  • 当然。刚刚添加。
  • 你还记得 AWS 端的 CORS/CSP 白名单 localhost 吗?
  • 当前允许的来源设置为所有。我不相信localhost 被排除在"*" 之外,但很高兴被告知我错了!

标签: php amazon-web-services amazon-s3 pem cacerts


【解决方案1】:

问题出在我的本地主机服务器设置中:

AWS HTTP 错误:cURL 错误 77:错误设置证书验证位置:CAfile:C:/wamp64/bin/php7.0.33/extras/ssl/cacert.pem

这不是正确的路径。

我添加了正确的 php.ini 路径(如下所示)并重新启动了服务器。现在可以了!

curl.cainfo="c:/wamp64/bin/php/php7.0.33/extras/ssl/cacert.pem" openssl.cafile="c:/wamp64/bin/php/php7.0.33/extras/ssl/cacert.pem"

【讨论】: