2013-02-03 8 views
1

내 S3 계정에 저장된 파일에 대한 만료 URL을 생성하는 약간의 PHP 코드를 만들었습니다. 나는 지금 당장 PHP가 처리 될 때 페이지로드에 만료 시간을 설정한다고 생각합니다.양식 제출시 만료 URL 생성

양식 제출시 시작하려면 만료 시간이 필요합니다 (다운로드 버튼으로 양식 버튼을 사용하고 다운로드 URL로 설정 한 작업).

누군가가 다운로드를 클릭하면 링크가 생성되고 만료 시간이 설정됩니다.

나는 액션 생성 = "에서 링크 생성 코드를 호출 할 필요가있을 것이라고 생각하지만 어떻게 할 것인가?

내 코드는 다음과 같습니다 :

<?php 
       // Grab the file url 
       $file_url = get_post_meta($post->ID, 'file_url', true); 
       // Grab just the filename with extension 
       $file = basename($file_url); 

       // AWS details     
       $accessKey = "<REMOVED>"; 
       $secretKey = "<REMOVED>"; 
       $bucket = "media.themixtapesite.com"; 

       // Set expiry time 
       $timestamp = strtotime("+30 seconds"); 
       $strtosign = "GET\n\n\n$timestamp\n/$bucket/$item"; 

       // Generate Signature 
       $signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true))); 

       // Create new S3 Expiry URL 
       $download_url = "http://$bucket/$file?AWSAccessKeyId=$accessKey&Expires=$timestamp&Signature=$signature"; 
       ?> 

       <?php if (is_user_logged_in()) { ?> 
       <div class="download_button_div"> 


<?php echo '<form method="post" action="'.$download_url.'" class="download_button_div">'; ?> 

<!--Download counter--> 
        <input type="hidden" name="download_counter" value="<?php (int)$download_count = get_post_meta($post->ID, 'download_counter', true); 
    $download_count++; 
    update_post_meta($post->ID, 'download_counter', $download_count); ?>"> 
        <button type='submit' class='download_button'>Download</button> 
        </form> 
        </div> 
        <?php } else { ?> 

은 언제나, 어떤 도움이 감사합니다.

답변

1

링크를 클릭하면 (양식을 제출하면) 새 서명을 얻기 위해 동기식 아약스 요청을 수행 할 수 있습니다.

양식 페이지에이 JavaScript를 넣어야합니다.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
<script type="text/javascript"> 
var form = null; 
$(document).ready(function(){ 
    $('form.download_button_div').submit(function(){ 
     form = $(this); 
     var ival = form.children('[name=item]').val(); 
     $.ajax('ajax_sig.php', { type:'POST', async:false, dataType:'json', data:{'itm':ival}, success:function(data){ 
      form.prop('action', form.prop('action').replace(/Signature=.+$/, 'Signature='+data.sig)); 
     } }); 
     return true; 
    }); 
}); 
</script> 

이 숨겨진 입력을 양식의 $ 항목과 함께 추가해야합니다.

<input type="hidden" name="item" value="<?php echo $item; ?>" /> 

ajax_sig.php 페이지를 만들어야합니다.

<?php 
// Item from ajax request 
$item = $_POST['itm']; 

// AWS details     
$secretKey = "<REMOVED>"; 
$bucket = "media.themixtapesite.com"; 

// Set expiry time 
$timestamp = strtotime("+30 seconds"); 
$strtosign = "GET\n\n\n$timestamp\n/$bucket/$item"; 

// Generate Signature 
$signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true))); 

// Ajax result 
$result = array('itm'=>$item, 'sig'=>$signature); 
echo json_encode($result); 
?> 
+0

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@? 나는 폼 페이지에 JS 코드를 추가했고 그 페이지와 같은 폴더에 ajax_sig.php 파일을 만들었다. 나는 그대로 PHP의 나머지 부분을 남겨 두는가? JS가 각 양식 제출을 가로 채고 새 서명을 생성한다고 가정합니다. 따라서 페이지로드시로드되는 서명은 양식 제출을 클릭 할 때마다 재생성됩니까? –

+0

숨겨진 입력을 양식에 추가 했습니까? 예, 그대로 PHP를 그대로 두십시오. JS는 각 양식 제출을 인터셉트하고 서명이 재생성됩니다. 작동하지 않습니까? 오류 메시지가 있습니까? 이미 파일 다운로드 페이지가 만료 시간이있는 서명의 유효성을 검사하도록 설정되어 있다고 가정합니다. – drolex

+0

JS에서 실수를 저질렀다고 생각합니다. 나는 고칠 것이다. – drolex

0

나는 더 복잡한 해결책을 제시하려고했지만, 나는 더 쉬운 방법을 생각했다. 만료 시간을 +300으로 설정하십시오 (양식을 작성하는 데 5 분 정도의 시간을줍니다). 대상 페이지의 서명을 확인합니다. 시그 (SIG)가 나쁘다면 파일을 제공하지 않습니다. 시그 (SIG)가 좋은 경우 현재 시간이 만료 시간을 지난 것인지 확인합니다. 그렇다면 파일을 제공하지 마십시오.

+0

감사합니다. @drolex - 문제는 우리가 타겟 '페이지'가 없다는 것입니다. 생성 된 링크가 모두 파일입니다. 그래서, 내가 뭘 하려는지 일단 링크가 클릭되면 (그리고 파일 다운로드가 시작됩니다) 타이머가 설정됩니다. –

+0

그건 문제가되지 않습니다. 대상 페이지가 있고 파일 다운로드입니다. 링크가있는 페이지가 열리면 타이머를 설정하기 만하면됩니다. 차이점이 뭐야? 그들이 클릭 할 때 타이머를 설정한다고 생각할 수있는 유일한 방법은 서명을 설정하고 서명을 확인한 페이지로 보내고 타이머를 사용하여 새 서명을 생성 한 다음 자동으로 파일 다운로드로 리디렉션하는 것입니다. 그러나, 그것은 단지 이해가되지 않습니다. – drolex