1

Amazon の S3 エンコーディング システムを処理してリンクを保護できるように、S3 リンクをエンコードする次の関数を作成しました。問題は、ファイルがバケットにある場合にのみ機能することです。バケットにサブフォルダーを作成してそこにファイルを貼り付けると、機能しません。私は何を間違っていますか?

function encodeS3($sURL,$sAccessKey,$sSecretKey,$nExpireMinutes = 5) {
  $sFile = basename($sURL);
  $sBucket = basename(str_replace('/' . $sFile,'',$sURL));
  $asQuery = array(
    'AWSAccessKeyId' => $sAccessKey,
  );
  $nExpireSecs = absint( $nExpireMinutes ) * 60;
  $nExpireSecs = time() + absint( $nExpireSecs );
  $asQuery[ 'Expires' ] = $nExpireSecs;
  $sAmazonText = "GET\n\n\n{$nExpireSecs}\n/{$sBucket}/{$sFile}";
  $asQuery[ 'Signature' ] = urlencode( base64_encode( ( hash_hmac( 'sha1', utf8_encode( $sAmazonText ), $sSecretKey, TRUE ) ) ) );
  $s = add_query_arg( $asQuery, "https://s3.amazonaws.com/{$sBucket}/{$sFile}" );
  return esc_url($s);
}
4

1 に答える 1

0

URL の解析方法を変更する必要がありました。

function encodeS3($sURL,$sAccessKey,$sSecretKey,$nExpireMinutes = 5) {
  /*
  $sFile = basename($sURL);
  $sBucket = basename(str_replace('/' . $sFile,'',$sURL));
  */
  $sURL = str_replace('https://','',$sURL);
  $sURL = str_replace('http://','',$sURL);
  $sURL = str_replace(urlencode('https://'),'',$sURL);
  $sURL = str_replace(urlencode('http://'),'',$sURL);
  $asParts = explode('/',$sURL);
  array_shift($asParts);
  $sBucket = array_shift($asParts);
  $sFile = implode('/',$asParts);

  $asQuery = array(
    'AWSAccessKeyId' => $sAccessKey,
  );
  $nExpireSecs = absint( $nExpireMinutes ) * 60;
  $nExpireSecs = time() + absint( $nExpireSecs );
  $asQuery[ 'Expires' ] = $nExpireSecs;
  $sAmazonText = "GET\n\n\n{$nExpireSecs}\n/{$sBucket}/{$sFile}";
  $asQuery[ 'Signature' ] = urlencode( base64_encode( ( hash_hmac( 'sha1', utf8_encode( $sAmazonText ), $sSecretKey, TRUE ) ) ) );
  $s = add_query_arg( $asQuery, "https://s3.amazonaws.com/{$sBucket}/{$sFile}" );
  return esc_url($s);
}

ところで、上記は WordPress でのみ利用可能な関数をいくつか使用しています。ストレートな PHP が必要な場合は、これを調整する必要があります。

于 2012-08-30T09:09:08.020 に答える