【问题标题】:Image file successfully uploaded using a Google App Engine application does not exist in bucket使用 Google App Engine 应用程序成功上传的图像文件在存储桶中不存在
【发布时间】:2015-02-22 21:11:45
【问题描述】:

我有以下代码:

我使用 CloudStorageTools::createUploadUrl() 方法创建应用程序特定的上传 URL,如下所示:

require_once 'google/appengine/api/cloud_storage  
/CloudStorageTools.php';
use google\appengine\api\cloud_storage\CloudStorageTools;

$options = [ 'gs_bucket_name' => 'myuserpics' ];
$upload_url =  
CloudStorageTools::createUploadUrl('/upload_handler.php', $options);

我使用上述 URL 作为我用于接受上传的表单的操作,如下所示:

<form action="<?php echo $upload_url?>"  
enctype="multipart/form-data"   method="post">
    Files to upload: <br>
    <input type="file" name="uploaded_files" size="40">
    <input type="submit" value="Send">
</form>

下面是upload_handler.php的内容:

<?php
    var_dump($_FILES);
?>

我在创建后 10 分钟内开始上传到上述 URL 并获得以下输出:

array(1) { 
    ["userfile"]=> array(5) { 
        ["name"]=> array(1) { 
            [0]=>   string(11) "fashion.jpg" 
        } 
        ["type"]=> array(1) { 
            [0]=> string(10) "image/jpeg" 
        } 
        ["tmp_name"]=> array(1) { 
            [0]=> string(200) "gs://myuserpics/***VERY LONG STRING***" 
        } 
        ["error"]=> array(1) { 
            [0]=> int(0) 
        } ["size"]=> array(1) { 
            [0]=> int(59527) 
        } 
    } 
} 

为存储桶“myuserpics”设置的权限是默认权限。

当我查看存储桶时,我没有看到上传的图像。

通过 Google Developers Console,我可以上传一张图片,然后在存储桶中看到它。但是,如果从应用程序上传图像,我无法在存储桶中看到它。我做错了什么?

【问题讨论】:

    标签: php image google-app-engine upload bucket


    【解决方案1】:

    您在脚本执行期间是否调用了move_uploaded_file 以将文件从临时 GCS 文件名中移出?

    在脚本执行结束时,所有临时文件(即 $_FILES['userfile']['tmp_name'])都会被垃圾收集并从存储桶中删除。

    【讨论】:

    • 我不调用 move_uploaded_file 因为它的目的是将上传的文件移动到新位置,我不想这样做。我希望文件保留在它上传到的存储桶中。
    • 请阅读:php.net/manual/en/features.file-upload.post-method.php 并注意“无论逻辑如何,您都应该从临时目录中删除文件或将其移至其他位置。”
    • [抱歉,无法编辑最后一条评论] - 还有“如果文件没有被移走或重命名,文件将在请求结束时从临时目录中删除。”在同一个链接中。
    【解决方案2】:

    问题:

    在我的代码中,上传图片后,我会立即显示它,并在其下方向用户显示一个表单,用于填写图片标题。用户提交表单后,我重命名图像并将其新名称和标题存储到数据库中。直到本周为止,这个程序已经运行了一年多。

    解决办法:

    上传图片后,我会先对其进行重命名,然后再将其与其关联的表单一起显示。

    结论:

    php 或 GAE 进行了更改,导致“垃圾收集”比以前更快地发生。如果这不是真的,那为什么我不能再等到用户提交表单再重命名图像?

    注意:我不使用之前建议的 move_uploaded_file,因为我不想更改图像的位置。

    【讨论】:

    • FWIW move_uploaded_file 与复制文件然后取消链接相同。
    • 当您使用 move_uploaded_file 时,您可以将文件从一个目录移动到另一个目录。当您重命名一个文件时,这是我一直在做并继续做的事情,您只需更改文件的名称,并且不能通过重命名将其从一个目录移动到另一个目录。所以,这两个程序肯定是不一样的。
    • 什么? php.net/manual/en/function.rename.php "尝试将旧名称重命名为新名称,必要时在目录之间移动"
    • 非常感谢您抽出宝贵时间回复这篇文章。
    猜你喜欢
    • 2010-11-09
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多