进度条 bootstrap、ajax laravel
Progress bar with bootstrap, ajax laravel
我正在尝试在上传文件和导入数据库中的数据时创建进度条。
我用 laravel 创建了一个导入器,用 jquery 创建了一个导入器 ajax。在这个导入器中,我从 CSV 文件中读取所有数据。我从该文件中获取所有行和列,在阅读该文件时,我正在使用 eloquent 执行插入查询。这是我的代码:
$fp = fopen($route, 'r');
// header
$head = fgetcsv($fp, 4096, ';', '"');
$header = [];
$header[0] = 'nomape';
$header[1] = 'direccion';
$header[2] = 'cp';
$header[3] = 'ciudad';
$header[4] = 'provincia';
$header[5] = 'telefono';
$header[6] = 'movil';
$rows = 0;
$cells = 0;
// Rows
while($column = fgetcsv($fp, 8192, ';', '"'))
{
// build array to can combine header and this array
$columns = [];
foreach ($column as $val) {
array_push($columns, $this->delete_accent($val));
}
$column = array_combine($header, $columns);
$result = Listado::insert($column);
if($result){
$rows++;
}
$cells++;
}
fclose($fp);
return 'Importados un total de: ' .$rows. ' de un total de: ' . $cells;
这些操作需要时间。在我 network tab
的网站 browser console
中,我可以在导入所有数据时显示我的 http 请愿处于待处理状态。我的 CSV 有一个 69000 寄存器。
我用这段代码构建了我的进度条:
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
// Place upload progress bar visibility code here
console.log(percentComplete);
}
}, false);
return xhr;
},
但是这个 returns 100% 的值以秒为单位,而这些操作需要花费很多分钟。我的问题是如何才能真正取得进展来创建我的进度条?
您需要改变方法,分两步完成 csv traitement,同时重复第二步直到文件结束。
第一步
使用ajax,进行正常上传而不处理数据。请求应该 return 带有行数的上传文件标识符。
第二步
使用 ajax,调用要处理的前 100 行(根据您的喜好更改 100 值)
请求响应后,更新进度条(因为您有总行数(100/69000 别名 0.1%)并要求处理接下来的 100 个条目。
重复此操作直到达到行数。在最后一个过程中,您可以删除文件。
PS:你需要一些方法来清理垃圾上传(那些他们的进程没有达到 100%)你可以通过巧妙地命名上传的文件来做到这一点。例如,将上传日期(加上唯一 ID)添加到文件名并删除任何早于 24 小时的内容。
对于上传,您可以使用客户端通知进度(如果您使用 ajax)。
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total * 100 >>>0;
// Do something with download progress
console.log("upload" + percentComplete + "%")
}
}, false);
对于导入和服务器处理进度,您可以使用 A. WebSockets 服务器或 B. API 服务提供商(例如 rejax.io)。然后,每当服务器取得进展时,您都会调用 API 并且客户端将收到。
// if using PHP for example.
Rejax::send($str_channel_name, $str_message);
正确的披露者:我运行https://rejax.io服务
我正在尝试在上传文件和导入数据库中的数据时创建进度条。
我用 laravel 创建了一个导入器,用 jquery 创建了一个导入器 ajax。在这个导入器中,我从 CSV 文件中读取所有数据。我从该文件中获取所有行和列,在阅读该文件时,我正在使用 eloquent 执行插入查询。这是我的代码:
$fp = fopen($route, 'r');
// header
$head = fgetcsv($fp, 4096, ';', '"');
$header = [];
$header[0] = 'nomape';
$header[1] = 'direccion';
$header[2] = 'cp';
$header[3] = 'ciudad';
$header[4] = 'provincia';
$header[5] = 'telefono';
$header[6] = 'movil';
$rows = 0;
$cells = 0;
// Rows
while($column = fgetcsv($fp, 8192, ';', '"'))
{
// build array to can combine header and this array
$columns = [];
foreach ($column as $val) {
array_push($columns, $this->delete_accent($val));
}
$column = array_combine($header, $columns);
$result = Listado::insert($column);
if($result){
$rows++;
}
$cells++;
}
fclose($fp);
return 'Importados un total de: ' .$rows. ' de un total de: ' . $cells;
这些操作需要时间。在我 network tab
的网站 browser console
中,我可以在导入所有数据时显示我的 http 请愿处于待处理状态。我的 CSV 有一个 69000 寄存器。
我用这段代码构建了我的进度条:
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
// Place upload progress bar visibility code here
console.log(percentComplete);
}
}, false);
return xhr;
},
但是这个 returns 100% 的值以秒为单位,而这些操作需要花费很多分钟。我的问题是如何才能真正取得进展来创建我的进度条?
您需要改变方法,分两步完成 csv traitement,同时重复第二步直到文件结束。
第一步 使用ajax,进行正常上传而不处理数据。请求应该 return 带有行数的上传文件标识符。
第二步 使用 ajax,调用要处理的前 100 行(根据您的喜好更改 100 值)
请求响应后,更新进度条(因为您有总行数(100/69000 别名 0.1%)并要求处理接下来的 100 个条目。
重复此操作直到达到行数。在最后一个过程中,您可以删除文件。
PS:你需要一些方法来清理垃圾上传(那些他们的进程没有达到 100%)你可以通过巧妙地命名上传的文件来做到这一点。例如,将上传日期(加上唯一 ID)添加到文件名并删除任何早于 24 小时的内容。
对于上传,您可以使用客户端通知进度(如果您使用 ajax)。
xhr.upload.addEventListener("progress", function(evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total * 100 >>>0;
// Do something with download progress
console.log("upload" + percentComplete + "%")
}
}, false);
对于导入和服务器处理进度,您可以使用 A. WebSockets 服务器或 B. API 服务提供商(例如 rejax.io)。然后,每当服务器取得进展时,您都会调用 API 并且客户端将收到。
// if using PHP for example.
Rejax::send($str_channel_name, $str_message);
正确的披露者:我运行https://rejax.io服务