【问题标题】:Laravel 5.1 using session.upload_progressLaravel 5.1 使用 session.upload_progress
【发布时间】:2016-01-23 03:03:24
【问题描述】:

我想用我的 php 脚本的状态构建一个进度条。我已经读到可以使用 session.upload_progress 来完成。

我正在使用 laravel Homestead,并且在 php.ini 中所有请求都处于活动状态。

这是我的 html

{!! Form::open(['route' => 'gebruikers_upload', 'class' => 'form-horizontal import', 'enctype' => 'multipart/form-data', 'target' => 'hidden_iframe']) !!}
                            <input type="hidden" value="myForm" name="{{ini_get("session.upload_progress.name")}}">
                            <input type="file" name="file" id="the-file"/>
                            <button class="btn btn-sm btn-info btn_import" type="submit">Importeer</button>
                            <button class="btn btn-sm btn-danger" type="button">Cancel</button>
                        {!! Form::close() !!}
                        {{--End Form--}}

                        <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe>

                        <div class="progress">
                            <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="25"
                                    aria-valuemin="0" aria-valuemax="100" style="width: 45%">
                                <span class="">45% Complete</span>
                            </div>
                        </div>

提交路线时:

Route::get('dashboard/gebruikers/upload_status', 'UserController@uploadStatus');

在方法uploadStatus的控制器UserController中我有这个

public function uploadStatus(Request $request)
{
    session_start();

    echo '<pre>';
        print_r($_SESSION);
    echo '</pre>';
}

但它总是显示一个空数组。当我使用这段代码时

    $data = $request->session()->all();

    echo '<pre>';
    print_r($data);
    echo '</pre>';

它返回这个

Array
(
    [_token] => jFkleI9kIZJiZP3pEARx0hDrHtsynPmuGkse97nT
    [_previous] => Array
        (
            [url] => http://localhost.dev:8000/dashboard/gebruikers/upload_status
        )

    [flash] => Array
        (
            [old] => Array
                (
                )

            [new] => Array
                (
                )

        )

    [login_82e5d2c56bdd0811318f0cf078b78bfc] => 1
)

但是没有关于进度更新的信息。

我如何在 laravel 5.1 中使用它

【问题讨论】:

    标签: session upload laravel-5.1 progress


    【解决方案1】:

    Laravel Documentation 拥有你需要的所有方法来搞乱会话。

    $request->session()->put('key', 'value');
    

    你可以像这样简单地将任何你想要的东西放到会话中。

    作为助手的简写,Laravel 为您提供了 session() 助手函数。它接受一个“键值对”数组来设置值或只接受一个键来从会话中检索任何值。

    【讨论】:

      【解决方案2】:

      我在尝试解决类似问题时遇到了这个问题:在客户端更新一个长时间运行的进程的进度。

      问题归结为:当您向服务器发出请求时,会话值不会写入会话存储,直到响应返回给客户端。基本上,流程是这样的:

              CLIENT         |        SERVER
                             |             .
      send request       ----|----> start processing
                             |             .
                             |             .
                             |             .
                             |     finish processing
                             |     write session values
      receive response  <----|---- return response
      

      你正在做的事情是这样的:

              CLIENT         |        SERVER
                             |             .
      send request       ----|----> start processing
                             |             .
                             |      (update session)
                             |             .
                             |      (update session)
                             |             .
                             |      (update session)
                             |             .
                             |     finish processing
                             |     write session values
      receive response  <----|---- return response
      

      但是服务器上的那些(update session) 调用被忽略了——它们实际上并没有被写入会话存储。因此,当客户端调用您的路由以请求进度的会话值时,它什么也得不到。

      解决方案很简单:将进度值写入其他地方。很久以前,我通过使用file_put_contents 将值写入文件来解决这个问题。如果我今天这样做,我可能会查看redis 服务器以获得更高的效率。

      但是,需要注意的一点是:如果您选择将值写入其他位置,则需要通过某种方式将值与会话相关联。否则,其他用户将覆盖您的值。对于一个简单的项目,我可能会使用用户的 ID 值(假设他们一次只处理一件事)。

      【讨论】:

      • 没错,如果你要在 Laravel 之外使用Illuminate/session 包,你需要在SessionManager 实例上调用save 方法来保存$_SESSION 变量的更新。
      猜你喜欢
      • 2013-02-08
      • 2015-09-26
      • 1970-01-01
      • 2016-02-13
      • 2015-12-25
      • 2016-03-10
      • 2016-07-13
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多