Mic*_*ael 2 php forms codeigniter
我是一个多部分表单,混合了默认输入(文本,选择等)和文件上传(<input type="file">).
我正在使用表单验证类和Codeigniter上传库的组合来提交表单.这很好用.
对于我还没有找到解决方案的问题,我只有一个问题:如果用户选择了一个图像但是错过了填充另一个必填字段(如"name"),则表单验证类会阻止请求并显示错误消息给客户.
但现在我的问题是,图像已经成功提交,我不想让用户再次添加文件.所以我想用这些数据预先填充文件输入.
我尝试了不同的东西:
<input type="file" name="image" value="<?php echo set_value('image','');?>" />
Run Code Online (Sandbox Code Playgroud)
并且还花时间在网上寻找解决方案,但没有成功.
在服务器端,您不会获得有关文件在客户端计算机上的位置的任何信息,因此在用户成功上载图像但用户尚未正确填写其余字段的情况下,您有简单地省略该input type="file"字段,但保留文件在服务器上的位置.有几种方法可以解决这个问题,但这一切都涉及获取上传文件的绝对位置,并且:
<input type="hidden" name="uploadedFile" value="<?php echo $absPath; ?>" />然后检查是否存在$_POST['uploadedFile']并适当地利用它.但这不是一个可靠的想法,因为您现在正在向最终用户公开服务器路径(使您自己受到恶意攻击.)$_SESSION变量中保存绝对路径,同时向用户提供重新尝试形式的简单令牌.我坚持使用方法2,因此假设您已完成所有工作以验证表单并上传文件并且文件位于其中$absFilePath,您可以执行以下操作:
session_start(); // This needs to be at the very top of you PHP file
// ...
$formToken = md5(time());
$_SESSION['uploadedFile'][$formToken] = $absFilePath;
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法将令牌呈现为隐藏变量:
if (!empty($_SESSION['uploadedFile'][$formToken]))
echo '<input type="hidden" name="formToken" value="'.$formToken.'" />';
Run Code Online (Sandbox Code Playgroud)
并使用隐藏文件上传部分
if (empty($_SESSION['uploadedFile'][$formToken]))
echo // <input type="file" output here...
Run Code Online (Sandbox Code Playgroud)
最后在表单提交代码中检查是否存在formToken值,然后尝试加载$_FILES['image']使用isset($_POST['formToken']),并使用以下方法处理它:
$absFilePath = $_SESSION['uploadedFile'][$_POST['formToken']];
Run Code Online (Sandbox Code Playgroud)
巴姆!现在,您拥有绝对文件路径,就好像文件已经像以前一样上传了.
由于你没有给出足够的代码,我只能给你足够的指导来帮助你入门,但这应该足够了.