我在一个Nginx服务器上testing一个plupload上传到S3。 整个项目是基于Laravel。
问题是当我开始上传时,Chrome的控制台说:
XMLHttpRequest cannot load http://BUCKET.s3.amazonaws.com/. Response for preflight is invalid (redirect)
我已经尝试使用PHP头来启用CORS,但仍然会出现错误。
目前的上传脚本:
<?php $bucket = 'BUCKET'; $accessKeyId = '***************'; $secret = '********************************************'; $policy = base64_encode(json_encode(array( 'expiration' => date('Ymd\TH:i:s.000\Z', strtotime('+1 day')), 'conditions' => array( array('bucket' => $bucket), array('acl' => 'public-read'), array('starts-with', '$key', ''), array('starts-with', '$Content-Type', ''), array('starts-with', '$name', ''), array('starts-with', '$Filename', ''), ) ))); $signature = base64_encode(hash_hmac('sha1', $policy, $secret, true)); ?> .... <div id="uploader"></div> .... <script> $(function () { $("#uploader").plupload({ runtimes: 'html5', url: 'http://<?php echo $bucket; ?>.s3.amazonaws.com/', multipart: true, multipart_params: { 'key': '${filename}', 'Filename': '${filename}', 'acl': 'public-read', 'Content-Type': 'image/jpeg', 'AWSAccessKeyId': '<?php echo $accessKeyId; ?>', 'policy': '<?php echo $policy; ?>', 'signature': '<?php echo $signature; ?>' }, file_data_name: 'file', filters: { max_file_size: '10mb', prevent_duplicates: true, mime_types: [ {title: "Image files", extensions: "jpg,jpeg"} ] } }); }); </script> ....
我检查了这个在Nginx上启用CORS,但事实是,当我把这个片段放在我的位置/块,它只是返回一个404,当我打开的URL。
我的Nginx站点configuration文件:
server { listen 80; server_name myserver.com; root /usr/share/nginx/myserver/public; index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/myapp-error.log error; sendfile off; client_max_body_size 100m; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; } location ~ /\.ht { deny all; } }
非常感谢
我找到了一个很好的实现方法。 深入学习http://laravel.com/docs/master/filesystem我没有找到一个有效的答案让Plupload工作。 否则,我发现一个糟糕的解决方案是使用一个:
<input type="file" name="files[]" multiple>
并使用像这样的东西:
foreach($request->file("files") as $file) { Storage::put( 'test'.rand(1,100), file_get_contents($file->getRealPath()) ); };
在我的控制器中,可以将多个文件上传到S3。 但它不是异步的,也是用户体验差。
我会继续努力,最终启用Plupload。 我会在这里发布更新。