Google app-engine – загруженные файлы не являются общедоступными в облачном хранилище Google

У меня есть приложение, которое позволяет пользователям загружать изображение, и я хочу, чтобы другие пользователи могли видеть это изображение.

Я использую метод CloudStorageTools :: createUploadUrl, который позволяет пользователям загружать через POST. Затем я беру загруженный файл и использую move_uploaded_file для его хранения в Google Cloud Storage.

Затем я использую CloudStorageTools :: getPublicUrl, чтобы получить URL-адрес файла. Он возвращает правильный URL, но файл не является общедоступным, поэтому я получаю ответ об ошибке XML «AccessDenied».

Я знаю, это потому, что файл не является общедоступным, но я не уверен, как сделать его общедоступным после его загрузки.

Я попробовал перейти к опции «acl = public-read» для createUploadUrl, но она вернула ошибку неизвестного параметра.

Я вижу пример того, как сделать это на этой странице: https://developers.google.com/appengine/docs/php/googlestorage/public_access, однако мой рабочий процесс требует, чтобы я разрешил обычную загрузку POST с помощью метода createUploadUrl, как показано здесь: https://developers.google.com/appengine/docs/php/googlestorage/user_upload

Как автоматически публиковать загруженные пользователем файлы?

Получил это, чтобы работать, используя file_put_contents с потоком.

$file = $_FILES['myfile'] $storeAt = 'gs://bucketname/filename.jpg 

Старый код

 $saved = move_uploaded_file($file['tmp_name'],$storeAt); 

Новый код, устанавливает разрешения и тип mime

 $options = array('gs'=>array('acl'=>'public-read','Content-Type' => $file['type'])); $ctx = stream_context_create($options); $saved = file_put_contents($storeAt, file_get_contents($file['tmp_name']), 0, $ctx); 

Иди меня!

По состоянию на 23 сентября 2014 года мне удалось загрузить файлы в Google Storage Cloud через appEngine и установить acl для public-read (всех), как это:

form.php :

 <? require_once 'google/appengine/api/cloud_storage/CloudStorageTools.php'; use google\appengine\api\cloud_storage\CloudStorageTools; $options = [ 'gs_bucket_name' => 'yourbucketname' ]; $upload_url = CloudStorageTools::createUploadUrl('/upload_handler.php', $options); ?> <form action="<?php echo $upload_url?>" enctype="multipart/form-data" method="post"> Files to upload: <br> <input type="file" name="userfile" size="40"> <input type="submit" value="Send"> </form> 

upload_handler.php :

 <?php require_once 'google/appengine/api/cloud_storage/CloudStorageTools.php'; use google\appengine\api\cloud_storage\CloudStorageTools; $fileName = 'gs://yourbucket/'.$_FILES['userfile']['name']; echo $fileName."<br>"; $options = array('gs'=>array('acl'=>'public-read','Content-Type' => $_FILES['userfile']['type'])); $ctx = stream_context_create($options); if (false == rename($_FILES['userfile']['tmp_name'], $fileName, $ctx)) { die('Could not rename.'); } $object_public_url = CloudStorageTools::getPublicUrl($fileName, true); echo $objectPublicUrl."<br>"; //header('Location:' .$objectPublicUrl); // redirects the user to the public uploaded file, comment any previous output (echo's). ?> 

Чтобы иметь возможность принимать большие файлы, я также создал собственный php.ini в базовом каталоге моего приложения:

php.ini :

 ; This is a simple php.ini file on App Engine ; It enables output buffering for all requests by overriding the ; default setting of the PHP interpreter. output_buffering = "On" max_file_uploads = 0 upload_max_filesize = 100M session.gc_maxlifetime = 10000 

app.yaml , устанавливает все файлы изображений как статические и .php's как runnable, он выглядит так:

 application: myapp version: 1 runtime: php api_version: 1 threadsafe: true handlers: # Serve images as static resources. - url: /(.+\.(gif|png|jpg))$ static_files: \1 upload: .+\.(gif|png|jpg)$ application_readable: true # Serve php scripts. - url: /(.+\.php)$ script: \1 

Надеюсь, это поможет кому угодно;)

параметр max_file_uploads не может быть 0.

max_file_uploads = 10 (или что угодно)

Ни один из перечисленных здесь вариантов больше не работает.

Единственный способ, которым я смог получить открытый доступ к файлам, чтобы создать ведро с открытым доступом и использовать его для загруженных файлов.

 gsutil defacl set public-read gs://bucket