2012-08-30 34 views
1

我編寫了以下函數來編碼我的S3鏈接,以便它們處理Amazon的S3編碼系統以保護鏈接。麻煩的是,它只有在文件在存儲桶中時才起作用。如果我將一個子文件夾放到存儲桶中,並將文件粘貼在那裏,則不起作用。我究竟做錯了什麼?如何讓我的Amazon 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); 
} 

回答

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,你必須調整它。

相關問題