Bha*_*ham 5 upload session progress laravel-5.1
我想建立一个具有我的PHP脚本状态的progess栏.我已经读过可以使用session.upload_progress来完成它.
我正在使用laravel Homestead,并且在php.ini中,所有的requerements都是活跃的.
这是我的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>
Run Code Online (Sandbox Code Playgroud)
提交te路线时:
Route::get('dashboard/gebruikers/upload_status', 'UserController@uploadStatus');
Run Code Online (Sandbox Code Playgroud)
并且在方法uploadStatus的控制器UserController中我有这个
public function uploadStatus(Request $request)
{
session_start();
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
}
Run Code Online (Sandbox Code Playgroud)
但它总是显示一个空数组.当我使用这个代码
$data = $request->session()->all();
echo '<pre>';
print_r($data);
echo '</pre>';
Run Code Online (Sandbox Code Playgroud)
它返回这个
Array
(
[_token] => jFkleI9kIZJiZP3pEARx0hDrHtsynPmuGkse97nT
[_previous] => Array
(
[url] => http://localhost.dev:8000/dashboard/gebruikers/upload_status
)
[flash] => Array
(
[old] => Array
(
)
[new] => Array
(
)
)
[login_82e5d2c56bdd0811318f0cf078b78bfc] => 1
)
Run Code Online (Sandbox Code Playgroud)
但是没有关于进度更新的信息.
我如何在laravel 5.1中使用它
我在尝试解决类似问题时遇到了这个问题:在客户端更新一个长时间运行的进程的进度。
问题归结为:当您向服务器发出请求时,会话值不会写入会话存储,直到响应返回给客户端。基本上,该过程如下所示:
CLIENT | SERVER
| .
send request ----|----> start processing
| .
| .
| .
| finish processing
| write session values
receive response <----|---- return response
Run Code Online (Sandbox Code Playgroud)
你在做什么是这样的:
CLIENT | SERVER
| .
send request ----|----> start processing
| .
| (update session)
| .
| (update session)
| .
| (update session)
| .
| finish processing
| write session values
receive response <----|---- return response
Run Code Online (Sandbox Code Playgroud)
但是(update session)服务器上的那些调用被忽略了——它们实际上并没有被写入会话存储。因此,当客户端调用您的路由以请求进度的会话值时,它什么也没有得到。
解决方案很简单:将进度值写入其他地方。很久以前,我通过使用file_put_contents. 如果我今天这样做,我可能会考虑使用redis服务器以提高效率。
但是,有一点需要注意:如果您选择将值写入其他地方,则需要通过某种方式将值与会话相关联。否则,其他用户将覆盖您的价值。对于一个简单的项目,我可能会使用用户的 ID 值(假设他们一次只处理一件事)。
Laravel 文档拥有扰乱会话所需的所有方法。
$request->session()->put('key', 'value');
Run Code Online (Sandbox Code Playgroud)
您可以像这样简单地将任何您想要的内容放入会话中。
作为辅助简写 Laravel 为您提供session()辅助功能。它接受一组“键值对”来设置值,或者只接受一个键来从会话中检索任何值。
| 归档时间: |
|
| 查看次数: |
493 次 |
| 最近记录: |