关键词:
【中文标题】使用 PHP 5.4 中的 session 和 codeigniter 上传进度条【英文标题】:Upload progress bar using session in PHP 5.4 with codeigniter 【发布时间】:2015-06-25 23:18:51 【问题描述】:参考本教程。 Tracking upload progress with php 。我想让它在 Codeigniter 中工作。我没有开始让它在 CI 中工作。我想上传文件并跟踪进度。
在我的 CI 视图中
<?php $arr = array("id"=>"myform");
echo form_open_multipart("welcome/uploads",$arr); ?>
<input type="hidden" value="myForm" name="<?php echo ini_get("session.upload_progress.name"); ?>">
<table>
<tr>
<td>file</td>
<td><input type="file" name="images[]" multiple></td>
</tr>
<tr>
<td>name</td>
<td><input type="text" name="naam"></td>
</tr>
<tr>
<td></td>
<td><input type="submit"></td>
</tr>
</table>
<?php echo form_close(); ?>
<div id="bar_blank">
脚本
function toggleBarVisibility()
var e = document.getElementById("bar_blank");
e.style.display = (e.style.display == "block") ? "none" : "block";
function createRequestObject()
var http;
if (navigator.appName == "Microsoft Internet Explorer")
http = new ActiveXObject("Microsoft.XMLHTTP");
else
http = new XMLHttpRequest();
return http;
function sendRequest()
var http = createRequestObject();
http.open("GET", "<?php echo base_url().'index.php/welcome/progress' ?>");
http.onreadystatechange = function () handleResponse(http); ;
http.send(null);
function handleResponse(http)
var response;
if (http.readyState == 4)
response = http.responseText;
document.getElementById("bar_color").style.width = response + "%";
document.getElementById("status").innerHTML = response + "%";
if (response < 100)
setTimeout("sendRequest()", 1000);
else
toggleBarVisibility();
document.getElementById("status").innerHTML = "Done.";
function startUpload()
toggleBarVisibility();
setTimeout("sendRequest()", 1000);
(function ()
document.getElementById("myForm").onsubmit = startUpload; //error is here
)();
根据上面的教程,它在核心 php.ini 中。当向控制器dashboard/addRoom
提交表单 CI 请求时,我的页面无论如何都会刷新。但在教程中,Form 重定向到 PHP_SELF
(相同的 php 文件)。我对此一无所知。请帮帮我。
控制器
function progress()
session_start();
$key = ini_get("session.upload_progress.prefix") . "myForm";
if (!empty($_SESSION[$key]))
$current = $_SESSION[$key]["bytes_processed"];
$total = $_SESSION[$key]["content_length"];
echo $current < $total ? ceil($current / $total * 100) : 100;
else
echo 100;
public function uploads()
if(!empty($_FILES['images']['name'][0]))
//uploadinf file code
【问题讨论】:
我已经使用 codeigniter 中的这个插件完成了文件上传等工作,malsup.com/jquery/form/progress2.html 我不想使用插件。 你卡在哪里了?你试过了吗? 对我来说问题是这样的。当我在 Codeigniter 中提交表单时。然后它进入控制器并刷新页面。那么是否可以运行ajax。 显示此表单的控制器和方法的名称是什么? 【参考方案1】:如果你只想用 jQuery 来做,那么我使用了 jQuery Form Submit 插件,它会给你带来进步等等。正如您在comments 中所说,您不需要任何插件,然后按照这些步骤并按照教程建议的方式实施。
假设您有控制器仪表板,并且方法 addRoom
正在显示您的 html 表单:
class Dashboard extends CI_Controller
function addRoom()
// Detect URI: http://example.com/dashboard/addRoom/upload_file
$upload_req = $this->uri->segment("3");
if( $upload_req == "upload_file" )
// Do the file upload Actions
// Generate Form
$this->load->view("Generate_view");
查看:
<?php
$ar = array("class"=>"form-horizontal");
echo form_open_multipart('dashboard/addRoom/upload_file',$ar);
?>
<input type="text" name="fileName">
<input type="file" name="upload">
<input type="submit" value="add">
<?php echo form_close(); ?>
在这种情况下,无论您是否提交,您的表单仍然在同一个控制器和方法上。
更新:根据更新的答案,请使用Session和File Uploads的codeigniter默认库,如果出现JS错误,请使用控制台选项卡(Chrome)调试错误,或者如果您正在使用 firefox 然后使用 firebug 扩展来调试 Javascript。
【讨论】:
现在按照 sitepoint 教程中的说明设置隐藏字段,并创建另一个模型,例如progress.php
,它将通过 ajax 获取信息。
嗨jogesh,我已经用我尝试过的方法编辑了我的问题。我在脚本中遇到错误(function () document.getElementById("myForm").onsubmit = startUpload; )();
【参考方案2】:
如果你只是想显示上传进度,有很多插件可以做到这一点,我不知道你为什么在标题中特别提到了 Session。
Here 是一个非常漂亮和简单的插件,可以轻松地与任何 PHP 框架一起使用。
代码示例
<script>
/*jslint unparam: true */
/*global window, $ */
$(function ()
'use strict';
// Change this to the location of your server-side upload handler:
var url = window.location.hostname === 'blueimp.github.io' ?
'//jquery-file-upload.appspot.com/' : 'server/php/';
$('#fileupload').fileupload(
url: url,
dataType: 'json',
done: function (e, data)
$.each(data.result.files, function (index, file)
$('<p/>').text(file.name).appendTo('#files');
);
,
progressall: function (e, data)
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
);
</script>
【讨论】:
谢谢。我不允许使用插件。 :(【参考方案3】:您缺少(我在您的代码中没有看到)您问题中的教程声明并在上传表单的 target
属性中使用 hidden iframe,这个是一种处理上传的方法,防止 form 页面 refresh(action url 将被加载到 iframe )。
google 用于隐藏 iframe 上传(最终用于 formdata 上传,现在应该是一种更好的方式来处理上传并使用少量 javascript 显示进度)
这里是一个使用隐藏 iframe Ajax File Upload Response Handling 的旧示例
更新
您应该将视图中的代码更改为$arr = array("id"=>"myForm")
目前我看到的是array("id"=>"myform")
(全小写)
getElementById
区分大小写,您使用 .getElementById("myForm").onsubmit
当您使用一些 javascript 并且某些东西没有按预期工作时,浏览器的 javascript 控制台 是第一个查看的地方,您应该会看到类似 (chrome) 的错误:
Uncaught TypeError: Cannot set property 'onsubmit' of null
这是因为getElementById
找不到带有id
myForm
的元素并返回null,在html/DOM 中它确实被命名为myform
。
更新
所以,我得到了工作,而不是 welcome
控制器,我创建了一个新的 Upload
控制器(大写,因为我使用的是 CI 3 dev,应该很容易适应它到旧版本),在工作文件下方。
网址将是http://your-host/optional-dir/index.php/upload
。
application/controllers/Upload.php
:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Upload extends CI_Controller
public function index()
$this->load->helper(array('form', 'url'));
$this->load->view('upload');
function progress()
session_start();
$key = ini_get("session.upload_progress.prefix") . "myForm";
if (!empty($_SESSION[$key]))
$current = $_SESSION[$key]["bytes_processed"];
$total = $_SESSION[$key]["content_length"];
echo $current < $total ? ceil($current / $total * 100) : 100;
else
echo 100;
public function uploads()
if(!empty($_FILES['images']['name'][0]))
//uploadinf file code
application/views/upload.php
:
<!DOCTYPE html>
<html>
<head>
<title>upload</title>
<style>
#bar_blank
border: solid 1px #000;
height: 20px;
width: 300px;
#bar_color
background-color: #006666;
height: 20px;
width: 0px;
#bar_blank, #hidden_iframe
display: none;
</style>
</head>
<body>
<?php $arr = array("id"=>"myForm", "target"=>"hidden_iframe");
echo form_open_multipart("upload/uploads",$arr); ?>
<input type="hidden" value="myForm" name="<?php echo ini_get("session.upload_progress.name"); ?>">
<table>
<tr>
<td>file</td>
<td><input type="file" name="images[]" multiple></td>
</tr>
<tr>
<td>name</td>
<td><input type="text" name="naam"></td>
</tr>
<tr>
<td></td>
<td><input type="submit"></td>
</tr>
</table>
<?php echo form_close(); ?>
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe>
<div id="status"></div>
<div id="bar_blank">
<div id="bar_color"></div>
</div>
<?php include_once(dirname(__FILE__).DIRECTORY_SEPARATOR.'upload.js.php'); ?>
</body>
</html>
./application/views/upload.js.php
:
<script>
function toggleBarVisibility()
console.log('toggleBarVisibility');
var e = document.getElementById("bar_blank");
e.style.display = (e.style.display == "block") ? "none" : "block";
function createRequestObject()
console.log('createRequestObject');
var http;
if (navigator.appName == "Microsoft Internet Explorer")
http = new ActiveXObject("Microsoft.XMLHTTP");
else
http = new XMLHttpRequest();
return http;
function sendRequest()
console.log('sendRequest');
var http = createRequestObject();
http.open("GET", "<?php echo base_url().'index.php/upload/progress' ?>");
http.onreadystatechange = function () handleResponse(http); ;
http.send(null);
function handleResponse(http)
console.log('handleResponse');
var response;
if (http.readyState == 4)
response = http.responseText;
document.getElementById("bar_color").style.width = response + "%";
document.getElementById("status").innerHTML = response + "%";
if (response < 100)
setTimeout("sendRequest()", 1000);
else
toggleBarVisibility();
document.getElementById("status").innerHTML = "Done.";
function startUpload()
console.log('startUpload');
toggleBarVisibility();
setTimeout("sendRequest()", 1000);
(function ()
console.log('init');
document.getElementById("myForm").onsubmit = startUpload; //error is here
)();
</script>
通知
为了方便起见,我使用原始的include_once
,因为 php base_url
在 javascript 中使用,可能会更好地在视图的 html 中使用一个小的内联 javascript,它声明一个带有 base_url
值的 javascript 变量然后像往常一样包含资产目录中的静态 javascript。
【讨论】:
同样的事情让我印象深刻。我会说正确的答案! +1【参考方案4】:我看到的教程实际上你必须在你的视图中编写 AJAX,并通过 ajax 而不是通过带有按钮的表单提交来调用控制器。所以你的页面不会被刷新。仔细查看您提供的链接的教程,当您向下滚动时,您会看到 javascript 通过 AJAX 发送 HTTP 请求,例如
function createRequestObject()
var http;
if (navigator.appName == "Microsoft Internet Explorer")
http = new ActiveXObject("Microsoft.XMLHTTP");
else
http = new XMLHttpRequest();
return http;
这是一个 1 函数,它创建 XMLHttpRequests 以从文件中获取响应,您必须通过控制器的 XMLHttpRequest 获取响应。
问候
【讨论】:
PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量
...置会话变量【英文标题】:PhPUploadprogressinPhP5.4isnotworking.Sessionvariablesnotset【发布时间】:2014-03-0907:28:41【问题描述】:我一开始就遇到了PhP文件上传进度监视器的问题。首先,这里是相关的PhP.ini设置(指令、本地值和主值):se... 查看详情
使用 PHP 5.4 禁用 WordPress 3.7 中的严格标准错误
】使用PHP5.4禁用WordPress3.7中的严格标准错误【英文标题】:DisablingStrictStandardsErrorsinWordPress3.7withPHP5.4【发布时间】:2013-11-0323:15:57【问题描述】:在将计算机更新到OSX10.9后,我试图通过我的php.ini文件禁用WordPress3.7中的STRICT错误... 查看详情
LARAVEL 5.4:ValidatePostSize.php 中的 PostTooLargeException(第 24 行)
...【发布时间】:2018-01-0503:13:32【问题描述】:我目前正在使用Laravel5.4开发应用程序。我正在使用xampp并使用以下配置更改了php.ini、php.in 查看详情
PHP 中的 session_unset 和 unset($_SESSION) 有啥区别? [关闭]
】PHP中的session_unset和unset($_SESSION)有啥区别?[关闭]【英文标题】:Whatisthedifferencebetweensession_unsetandunset($_SESSION)inPHP?[closed]PHP中的session_unset和unset($_SESSION)有什么区别?[关闭]【发布时间】:2015-12-0622:29:08【问题描述】:用session_un... 查看详情
servlet使用sessio和springmvc中的controller使用session
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException request.setCharacterEncoding("UTF-8"); response.setHeader("Content-type","text/html;c 查看详情
反序列化与session(代码片段)
0x00前言:php存储session有三种模式,php_serialize,php,binary这里着重讨论php_serialize和php的不合理使用导致的安全问题关于session的存储,java是将用户的session存入内存中,而php则是将session以文件的形式存储在服务器某个tmp文件中,可... 查看详情
求救:主机的php.ini中的session.save_path设置
参考技术Aphp.ini中的session配置说明 下面介绍能让session运行的必要配置步骤 手动配置PHP运行环境时,最容易遗忘的一项是服务器端session文件的存储目录配置工作,打开php.ini文件,搜索Session,找到session.save_path,默认值为... 查看详情
php artisan migrate 不适用于 Laravel 5.4 中的 XAMPP
...vel5.4【发布时间】:2020-02-2915:52:33【问题描述】:我正在使用命令“phpartisanmigrate”,但它显示错误为用户拒绝访问,我的所有迁移都已成功创建,但它们无法在localhostphpmyadmin中迁移?在命令promt中我 查看详情
php-session和cookie的使用及区别
1.cookie的使用什么是Cookie?cookie常用于识别用户。cookie是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送cookie。通过PHP,您能够创建并取回cookie的值。如何创建cookie?se... 查看详情
使用 PHP $_Session 和 NO SQL 创建单页购物车
】使用PHP$_Session和NOSQL创建单页购物车【英文标题】:CreateaonepageshoppingcartusingPHP$_SessionandNOSQL【发布时间】:2017-06-1720:09:46【问题描述】:我正在学习一些PHP,我正在尝试创建一个多合一的购物车。我已经阅读并看到了SQL基础系... 查看详情
在 HIVE 中使用 CDH 5.4 和 Spark 1.3.0 和 Parquet 表的 PySpark 中的 Parquet 错误
】在HIVE中使用CDH5.4和Spark1.3.0和Parquet表的PySpark中的Parquet错误【英文标题】:ParquetErrorsinPySparkusingCDH5.4andSpark1.3.0withParquetTableinHIVE【发布时间】:2015-05-1910:35:54【问题描述】:我正在运行CDH5.4,使用Spark1.3.0和SparkonYARN支持。当我... 查看详情
在 Node 中使用 MemoryStore 存储会话数据,类似于 PHP 中的 $_SESSION['data'] = value
】在Node中使用MemoryStore存储会话数据,类似于PHP中的$_SESSION[\\\'data\\\']=value【英文标题】:StoresessiondatausingMemoryStoreinNode,similarto$_SESSION[\'data\']=valueinPHP在Node中使用MemoryStore存储会话数据,类似于PHP中的$_SESSION[\'data\']=value【发布时... 查看详情
与 php 中的 session_start() 相关
】与php中的session_start()相关【英文标题】:relatedtosession_start()inphp【发布时间】:2015-03-1704:57:49【问题描述】:我是PHP的新用户。我正在处理一些php项目。想要一些关于php会话的帮助。我有login.html页面,该页面对login.js执行表单... 查看详情
laravel 5.4 迁移问题
...了一个非常奇怪的问题phpartisanmigrate在本地XAMPP服务器上使用php7.1.1全新安装Laravel5.4。它所做的是创建一个迁移和用户表,这是旧版本Laravel中的默认表。应该创建的是用户表和密码重置表,即新的默认表。我的env文件是正确的,... 查看详情
(php)获取不到session的值在其他页面我在这边存储了一个session跳转到其他页面就获取不到了
语法应该没什么问题输出session也没报错大概是配置问题php.ini改如何配置Session(详解)这个问题是你的页面没有关联比如你有a.phpb.php和c.php你在a.php里面使用session,那么b.php和c.php肯定是取不到session的啦你这样,把a.php作为公共页面... 查看详情
php中的jquery如何获得session的值
php中的jquery如何获得session全局变量的多个值和个数???参考技术A<inputtype="hidden"name="session_value"value="session值"/>$(function()varsession_value=$("input[name='session_value']").val();) 参考技术B放在隐藏域... 查看详情
Xuggler,xuggler 5.4 中的转发和倒带视频不起作用
...间】:2013-03-0407:02:48【问题描述】:我在我的应用程序中使用了xuggle-xuggler5.4来添加视频和音频播放功能,我已经深入谷歌并找到了以下sn-p:longduration=container.getDurati 查看详情
django中的cookies和session机制(代码片段)
0.概述(1)为什么要有cookies和session 在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。而在现实网站中,那淘宝网来举例,用户将商... 查看详情