我正在开发一个用户可以上传播客的网站。播客将是 MP3 文件,并存储在 Amazon S3 存储桶中。
这个的正常流程是什么?我用谷歌搜索过,但任何与文件上传相关的文章都倾向于使用亚马逊客户端库,理想情况下,由于超时,我不想使用 PHP(我正在使用 LAMP 堆栈)上传 MP3 文件,文件尺寸限制等
有没有解决的办法?
After lots of Googling, and back-and-forth on both the GitHub repository and Amazon documentation for the new PHP SDK, I’ve got a solution using Amazon’s new PHP SDK to generate the form fields, and Uploadify to actually upload the file directly to Amazon, bypassing my server. The code looks a little like this:
<?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>
对 S3 的请求必须使用有效的密钥签名,并且始终包含授权。从理论上讲,您可以在客户端使用 JavaScript 执行此操作,但如果您不想将密钥公开给客户端,这将涉及 Ajax 调用来签署您的标头。另一个问题是浏览器兼容性。您必须使用文件切片并计算所有现代浏览器中都可用的更大文件的校验和。
更简单的方法是使用 PHP 或任何其他服务器端脚本语言的服务器端解决方案
尽管您使用 php,但您不必担心文件大小,您可以在文件中配置上传文件大小限制和执行内存限制,php.ini
而 s3 的 php 库将减少您的工作量。您可以从本指南开始。