我正在CodeIgniter 2.0.2中编写一个简单的文件上传器。粘贴下面的代码。 在某些条件下,浏览器在上传过程中挂起,我在浏览器状态栏中“等待localhost”(FF和Chrome中的行为相同)。 我已经验证该文件正在上传到Windows临时文件夹(完整文件),但此后进程被卡住了。 看来bug的条件是文件大小。但我的php.ini具有上传文件的所有正确设置,我仍然得到一个700k文件的挂起。 只有当我在Windows 7 Apache上运行它而不是在Ubuntu机器上运行时,才会出现此错误。 建议我php.ini中的某些路径可能设置不正确。 Apache日志文件在这里没有太大帮助,因为没有抛出错误。 我曾尝试使用Chrome开发人员面板进行调试,但尚未发现有用的内容。 我目前正在努力让XDebug工作,但由于没有抛出任何错误且过程没有完成,我的期望很低。 有关如何追踪此错误的任何建议? 如果你想看到特定的php.ini设置,请告诉我,不要做大转储。
控制器:
function do_upload_sql(){
// create directory
if (! is_dir(BACKUP_DIR)) {
mkdir(BACKUP_DIR, 0777);
}
// or if it exists and has restricted file permissions, change them
elseif(fileperms(BACKUP_DIR)!=0777){
chmod(BACKUP_DIR, 0777);
}
$config['upload_path'] = BACKUP_DIR;
$config['allowed_types'] = 'backup'; // an SQL backup file type
$config['overwrite'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload()) // this is the native CI function, probably where the problem is. I can provide some of that code if anyone wants.
{
$data['action'] = 'c_backup_restore/do_upload_sql';
$tab_error = array('error' => $this->upload->display_errors());
$data['error'] = $tab_error['error'];
$this->load->view('common/header');
$this->load->view('v_upload_sql', $data);
}
else
{
echo "success"; // yes it's getting here, but i get no file!
$data = array('upload_data' => $this->upload->data());
$file_upload = $data["upload_data"];
$this->restore_backup($file_upload); // go do something useful with the file
}
}
查看:
<p>Select the backup file</p>
<div class="not_success"><?php echo $error;?></div>
<?php echo form_open_multipart($action);?>
<input type="file" name="userfile" size="30" />
<input type="submit" value="Upload" />
</form>
答案 0 :(得分:0)
如果您的错误仅发生在Windows 7 apache上,我认为您的问题可能是“is_dir()”“mkdir()”和“chmod()”命令 - 这些终端命令是特定于Linux的,不会在Windows系统上工作得非常好。
我查看了PHP.net手册中的mkdir()函数文档:
http://us.php.net/manual/en/function.mkdir.php
我在评论部分找到了这个:
kendsnyder at gmail dot com 04-May-2007 08:17 在Windows中创建目录时,将忽略尾随句点(“。”)。例如:
<?php
mkdir('c:/Buck Jr.',0755); // on Windows creates "c:/Buck Jr"
mkdir('c:/Elipses...',0755); // on Windows creates "c:/Elipses"
mkdir('c:/php.com',0755); // on Windows creates "c:/php.com"
?>
This is a Window's quirk, not a php shortcoming--meaning that you get the same results from a Window's command prompt.
所以看起来它会起作用......但你可能不得不用它来找到Windows系统喜欢的味道。此外,您似乎必须指定用于创建目录的根驱动器,例如:'c:\ somedir'
同样感兴趣的是,我做了一个快速的谷歌搜索,发现PHP已经发布了一个关于你正在使用的功能的错误,特别是与Windows与Linux系统的前向与反斜杠相关:
https://bugs.php.net/bug.php?id=29797
以下是与您的问题相关的StackOverflow帖子:
PHP mkdir(), chmod() and Windows
总结一下:
在基于Windows的Web服务器上,包含将放置目录的驱动器
Windows上的文件权限与Linux不同(Windows没有像Linux那样的chmod或文件权限结构!)虽然我可以告诉Windows,但是应该给出一个相当于777权限级别的文件夹 - - 但这个功能似乎有问题且容易出错。但这也意味着在Windows系统上使用chmod()函数会得到不可预测的结果。有关更多信息,请参阅PHP手册:http://php.net/manual/en/function.chmod.php
请记住对目录路径使用反斜杠而不是正斜杠,因为Windows系统使用反斜杠,而Linux使用正斜杠。
当PHP创建目录时,它使用授予PHP运行的用户帐户的权限,这意味着您可能需要深入了解Windows以查找Windows 7 Apache / PHP的用户权限级别正在运行并在那里做出改变。我知道,多么痛苦,对吧?
最后一件事:如果目录创建成功,则mkdir()函数返回true,否则返回false - 您可能希望在继续执行其余代码之前测试该条件,因为如果目录如果没有正确创建,依赖于该目录的所有其余代码都将失败。最终我认为你的浏览器暂时搁置提交,因为它试图通过PHP访问一个功能,而Windows上没有支持(chmod)。在“Try / Catch”块中执行函数调用以捕获发生的任何异常,以便您可以在必要时将它们打印到屏幕或日志文件中:
$proceed = false;
try
{
// create directory
if (! is_dir(BACKUP_DIR)) {
$proceed = mkdir(BACKUP_DIR, 0777);
}
// or if it exists and has restricted file permissions, change them
elseif(fileperms(BACKUP_DIR)!=0777){
$proceed = chmod(BACKUP_DIR, 0777);
}
}
catch(Exception $e)
{
echo $e->message;
}
if($proceed == TRUE)
{
/*Proceed with your code*/
}
else
{
/*Gracefully fail*/
}
祝你好运,这就是为什么我更喜欢用于网络服务器的Linux Box!
干杯!