谷歌应用引擎 - 上传的文件在谷歌云存储上不公开

时间:2014-06-26 16:20:55

标签: php google-app-engine google-cloud-storage

我有一个允许用户上传图片的应用,我希望其他用户能够看到该图片。

我使用CloudStorageTools :: createUploadUrl方法允许用户通过POST上传。然后,我将获取上传的文件,并使用move_uploaded_file将其存储在Google云端存储中。

然后,我使用CloudStorageTools :: getPublicUrl来获取文件的URL。它返回正确的URL,但该文件不可公开访问,因此我收到XML错误响应“AccessDenied”。

我知道这是因为该文件未公开共享,但我不确定如何在上传后将其公开。

我尝试将“acl = public-read”选项传递给createUploadUrl,但它返回了未知选项的错误。

我在这个页面上看到了一个示例:https://developers.google.com/appengine/docs/php/googlestorage/public_access但是,我的工作流程要求我使用createUploadUrl方法允许正常的POST上传,如下所示:https://developers.google.com/appengine/docs/php/googlestorage/user_upload

如何让用户上传的文件自动公开访问?

4 个答案:

答案 0 :(得分:6)

使用带有流的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);

转发我!

答案 1 :(得分:1)

截至2014年9月23日,我设法通过appEngine将文件上传到Google Storage Cloud,并将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

希望它可以帮助其他人;)

答案 2 :(得分:0)

选项max_file_uploads不能为0.

max_file_uploads = 10(或任何你想要的)

答案 3 :(得分:0)

此处列出的所有选项似乎都不再起作用。

我能够获取文件的公共访问权限,以创建具有公共访问权限的存储桶并将其用于上传文件。

gsutil defacl set public-read gs://bucket