允许用户将MP3上传到Amazon S3

时间:2012-11-06 11:28:52

标签: php amazon-s3

我正在一个用户可以上传播客的网站上工作。播客将是MP3文件,并存储在Amazon S3存储桶中。

这是什么正常流程?我用Google搜索了,但是任何与文件上传相关的文章都倾向于使用亚马逊客户端库,理想情况下我不想使用PHP(我使用LAMP堆栈)来上传MP3文件,因为超时,文件大小限制等。

有解决方法吗?

4 个答案:

答案 0 :(得分:4)

Amazon S3支持direct uploads。这可能是一个选择。对于PHP实现,check out this post

答案 1 :(得分:1)

经过大量谷歌搜索,并在新的PHP SDK的GitHub存储库和亚马逊文档上来回,我有一个解决方案,使用亚马逊的新PHP SDK生成表单字段,并使用Uploadify实际上传该文件直接到亚马逊,绕过我的服务器。代码看起来有点像这样:

<?php
$bucket = (string) $container['config']->images->amazon->bucket;
$options = array(
    'acl' => CannedAcl::PUBLIC_READ,
    'Content-Type' => 'audio/mpeg',
    'key' => 'audio/a-test-podcast.mp3',
    'success_action_redirect' => (string) $container['config']->main->base_url . 'upload/success/',
    'success_action_status' => 201,
    'filename' => '^'
);
$postObject = new PostObject($container['amazon_s3'], $bucket, $options);
$postObject->prepareData();

$formAttributes = $postObject->getFormAttributes();
$formInputs = $postObject->getFormInputs();

$uploadPath = $formAttributes['action'];
?>
<script>
    (function($) {
        $('#podcast').uploadify({
            'buttonClass': 'button',
            'buttonText': 'Upload',
            'formData': <?php echo json_encode($formInputs); ?>,
            'fileObjName': 'file',
            'fileTypeExts': '*.mp3',
            'height': 36,
            'multi': false,
            'onUploadError': function(file, errorCode, errorMsg, errorString) {
                console.log('onUploadError', file, errorCode, errorMsg, errorString);
            },
            'onUploadSuccess': function(file, data, response) {
                console.log('onUploadSuccess', file, data, response);
            },
            'swf': '/assets/cms/swf/uploadify.swf',
            'uploader': '<?php echo $uploadPath; ?>',
            'width': 120
        });
    })(jQuery);
</script>

答案 2 :(得分:0)

你不必担心文件大小虽然使用php你可以在php.ini文件中配置上传文件大小限制和执行内存限制,而s3的php库会减少你的工作。您可以从this guide开始。

答案 3 :(得分:0)

对S3的请求必须使用有效的密钥进行签名,并始终包含授权。您可以在理论上使用JavaScript在客户端执行此操作,但如果您不希望将密钥公开给客户端,则会涉及Ajax调用以对您的标头进行签名。另一个问题是浏览器兼容性。您将不得不使用文件切片并计算所有现代浏览器中可用的较大文件的校验和。

更简单的方法是使用PHP或任何其他服务器端脚本语言的服务器端解决方案