1

我编写了一个小的 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 { ?>

一如既往,任何帮助表示赞赏。

4

2 回答 2

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);
?>
于 2013-02-04T21:42:31.233 回答
0

我打算给出一个更复杂的解决方案,但我想到了一个更简单的方法。将到期时间设置为 +300(给他们 5 分钟左右的时间来完成表格)。您将检查目标页面上的签名。如果信号不好,那么您就不要提供文件。如果 sig 是好的,那么你检查当前时间是否超过了到期时间。如果是这样,那么不要提供文件。

于 2013-02-04T11:10:28.640 回答