我制作了一些PHP代码,可以生成存储在我的S3帐户中的文件的过期URL。 我现在拥有代码的方式我认为它设置了页面加载的到期时间(处理PHP时)。
我需要在表单提交时开始到期时间(我使用表单按钮作为下载按钮,操作设置为下载URL)。
因此,当有人点击下载时,会生成链接并设置到期时间。
我想我需要从表单action =“”调用链接生成代码,但不知道我会怎么做?
我的代码如下:
<?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 { ?>
一如既往,任何帮助表示赞赏。
答案 0 :(得分:1)
您可以在点击链接(提交表单)时执行同步ajax请求以获取新签名。
您需要将此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>
您需要使用表单中的$ item添加此隐藏输入。
<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);
?>
答案 1 :(得分:0)
我打算提出一个更复杂的解决方案,但我想到了一个更简单的方法。将到期时间设置为+300(给他们5分钟左右来完成表格)。您将检查目标页面上的签名。如果sig是坏的,那么你不给文件。如果签名是好的,那么你检查当前时间是否超过到期时间。如果是,那么不要给文件。