【问题标题】:laravel deployed on google app engine doesn't upload files部署在谷歌应用引擎上的laravel不上传文件
【发布时间】:2014-06-26 19:04:15
【问题描述】:

我正在尝试上传文件,我正在使用 laravel 4 并在谷歌应用引擎上部署。本地文件上传工作,但是当使用谷歌应用引擎部署时它没有。 这是我的代码:

查看:

{{ Form::model($v, array('files' => true,'route' => array('upload.image', $v->id),'method' => 'post','class'=>'form-horizontal','id'=>'upload-images')) }}
            {{ Form::file('image') }}
            <br>
            {{ Form::submit('Add Photo', array('class' => 'btn btn-primary' )) }}
            {{ Form::close() }}

控制器

$file = Input::file('image');
        dd($file);
        $destinationPath = 'img_gallery/';
        $extension = $file->getClientOriginalExtension();
        $filename = 'img_' . $id . '.' . $extension;
        $file->move($destinationPath, $filename);

        $car = Car::find($id);
        $car->Pic = $filename;
        $car->save();
        return Redirect::to('/');

它会显示一个带有文件 attr 的数组。但是当使用谷歌应用引擎部署时,此代码返回 NULL。在阅读了 php 的 google app engine 文档后,我了解到问题是在 google app engine 中您无法写入文件系统应用程序,而在this link 我发现没有 laravel 的 php 代码并尝试与我的代码结合,如下所示:

upload_test.blade.php

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

use google\appengine\api\cloud_storage\CloudStorageTools;

$options = [ 'gs_bucket_name' => 'images_upload'];
$upload_url = CloudStorageTools::createUploadUrl('upload.handler', $options);
?>
<div class="body">
    <form action="<?php echo $upload_url ?>" enctype="multipart/form-data" method="post">
        <input type="file" name="uploaded_files" size="40">
        <input type="submit" value="Send">
    </form>
</div>

控制器

 public function upload_image($id) {
        $file = Input::file('image');
        dd($file);
}

路线

Route::group(array('before' => 'auth'), function() {
    Route::post('upload_handler', array('as' => 'upload.handler', 'uses' => 'CarController@upload_handler'));
});

控制器

public function upload_handler() {
        var_dump($_FILES);
    }

但这显示:

Symfony\Component\HttpKernel\Exception\ MethodNotAllowedHttpException

我知道这是一个错误,因为表单 post 没有指向路由,而是指向变量。该图像存储在谷歌应用引擎中,但问题是此代码不会发布到控制器以将文件路径保存在数据库中。我尝试了其他方法,但没有结果。我还逐步按照this 中的第 6 节进行操作。此外,我尝试了Ajessup package,但没有结果。

【问题讨论】:

  • 您似乎并没有以 Laravel 4 打算使用的 MVC 方式做事 - 上传处理程序实际上应该通过路由 (@987654325) 指向控制器 (laravel.com/docs/controllers) @),并且在 Routes 配置中,您可以指定给定路由允许哪些 http 方法。包括云存储库也应该真正在视图之外处理。
  • @glendaviesnz 我编辑了我的问题。看看
  • Doh - 抱歉 - 在我的第一条评论中忽略了在应用程序引擎上运行 Laravel 的影响,这会使事情稍微复杂化,就像你通常做的那样通过控制器上传文件 - 希望其他人有为您解决此问题 - 可以选择将 Laravel Storage 指向 Cloud Storage,如 gae-php-tips.appspot.com/2013/10/22/… 所述。
  • @glendaviesnz 我试过了,但还是一样。它不会将文件上传的属性从视图传递到控制器。我还有什么选择?我可以使用谷歌应用引擎在谷歌驱动器中上传文件吗?
  • @Stuart Langley 你能看看我的问题吗

标签: php google-app-engine laravel


【解决方案1】:

用这一行:

$upload_url = CloudStorageTools::createUploadUrl('upload.handler', $options);

第一个 arg 应该是一个 URL - 尝试删除引号(假设 upload.handler 指向您想要的位置),或者尝试将该 arg 替换为应用程序应该重定向到的实际 URL。

【讨论】:

    【解决方案2】:

    如果它与您的本地开发服务器而不是您的远程服务器一起使用,我认为这是一个权限问题。要修复它,请尝试以下操作:

    1. 转到cloud console
    2. 转到您的项目、存储、云存储、存储浏览器
    3. 检查您的存储桶是否存在以及它是否具有写入您的服务帐户名称的权限,可以在appengine dashboard 中找到

    我建议您使用默认的 GCS 存储桶:

    1. 转到appenigne dashboard,应用程序设置
    2. 如果您有一个按钮,上面写着:生成云集成项目,请点击它
    3. 如果那里列出了 Google Cloud Storage 存储桶,请将其用作“images_upload”存储桶的替代品。它应该类似于“appid.appspot.com”

    【讨论】:

    • 我按照你说的做了,但仍然显示本地显示的文件 attr 的 NULL insted。还有其他建议吗?
    • 在哪里检查写权限?
    • 选择存储桶,存储桶权限,并检查该列表中是否有带有写入的服务帐户名称。
    • 我用的是默认bucket,还是没有上传文件
    • 在 app.yaml 文件附近的 php.ini 中,您是否添加了 google_app_engine.enable_functions = "libxml_disable_entity_loader"?我的一个使用上传和 php 的朋友必须把它放在那里才能工作
    【解决方案3】:

    这种情况的更好替代方案是将文件上传为一组请求可以处理的大小。

    示例项目 - https://github.com/pionl/laravel-chunk-upload-example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多