Laravel + Plupload上传到S3响应预检无效 – CORS

我在一个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工作&#x3002; 否则,我发现一个糟糕的解决方案是使用一个:

 <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。 我会在这里发布更新。

也许值得你看看Barryvdh的cors包:

https://github.com/barryvdh/laravel-cors

这固定了我的CORS问题。