我有一个允许用户上传图片的应用,我希望其他用户能够看到该图片。
我使用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
如何让用户上传的文件自动公开访问?
答案 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