2015-11-30 3 views
15

Я тестирую загрузку plupload на S3 на сервере Nginx. Весь проект основан на Laravel.Ошибка Laravel + Plupload для ответа S3 для предполета - CORS

Проблема заключается в том, когда я начала загрузки, консоль 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('Y-m-d\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> 
.... 

Я проверил this, чтобы включить CORS на Nginx, но тот факт, когда я ставлю этот фрагмент на моем местоположения/ блока он просто возвращает 404, когда я открываю URL ,

Мой Nginx файл конфигурации сайта:

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; 
    } 

} 

Большое спасибо

ответ

2

Я нашел способ добиться этого плохо. Изучая 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. Но это не асинхронно, а также UX хуже.

Я буду продолжать работать, чтобы включить Plupload. Я буду публиковать обновления здесь.

1

Это может быть, вам стоит смотреть на пакет Корс по Barryvdh:

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

Это фиксированное мои CORS вопрос.

+0

Не работает, возможно, это не на 100% совместимо с Laravel 5.1 – vpedrosa