2014-11-06 106 views
2

我是一个混合了默认输入(文本,选择等)和文件上传(<input type="file">)的多部分表单。表单提交后填写文件输入/表单提交错误

我正在使用表单验证类和Codeigniter的上传库进行表单提交。这很好。

我只有一个问题,我还没有找到解决方案:如果用户选择一个图像,但错过填补另一个必填字段(如“名称”),然后表单验证类阻止请求和向客户显示错误消息。

但现在我的问题是,该图像已成功提交,我不想让用户再次添加文件。所以我想用这些数据预先填充文件输入。

从来就尝试不同的东西,如:

<input type="file" name="image" value="<?php echo set_value('image','');?>" /> 

,也花时间在网络上寻找,但都没有成功的解决方案。

+0

尝试使用隐藏的输入,当用户已经上传了图像,如”/>'再次检查用户提交的文件,如果没有,然后检查隐藏的输入字段。如果它有价值意味着他已经上传了其他用户没有附加图像yet.Hope你会明白。 – 2014-11-06 20:07:37

回答

5

在服务器端,你没有得到有关其中文件位于客户端的计算机上的任何信息,所以在用户的​​情况下成功地上传图片,但用户未填写其余这些字段是正确的,你必须完全忽略input type="file"字段,但要保存文件在服务器上的位置。有几种方法去这个问题,但它所有涉及服用上传文件的绝对位置和:

  1. 插入回为使用<input type="hidden" name="uploadedFile" value="<?php echo $absPath; ?>" />然后为$_POST['uploadedFile']的生存确认,并适当地利用它隐藏的价值。但是,这并不是一个明确的想法,因为您现在正在向最终用户公开服务器路径(打开自己直到恶意攻击)。
  2. 启动会话并在$_SESSION变量中保存绝对路径,同时向用户显示一个简单的标志在他们的重新尝试形式。

我会坚持使用方法2,所以假设你已经做了所有的工作,以验证表单,并上传文件和文件位于$absFilePath,你可以做到以下几点:

session_start(); // This needs to be at the very top of you PHP file 

// ... 

$formToken = md5(time()); 
$_SESSION['uploadedFile'][$formToken] = $absFilePath; 

然后,使用呈现令牌作为隐藏变量:

if (!empty($_SESSION['uploadedFile'][$formToken])) 
    echo '<input type="hidden" name="formToken" value="'.$formToken.'" />'; 

和隐藏使用

文件上载部 的 formToken值的存在,你的表单提交的代码检查的内部

终于尝试使用isset($_POST['formToken'])加载$_FILES['image'],并用处理前:

$absFilePath = $_SESSION['uploadedFile'][$_POST['formToken']]; 

巴姆!现在你已经有了你的绝对文件路径,就好像文件已经像以前一样上传了。

既然你没有给出足够的代码,我只能给你足够的指令来让你开始,但这应该是绰绰有余。

+0

好吧,所以CI似乎没有设计模式可以让我解决问题!使用框架时,“手动”解决方案总是一种方式,但不是很好:)感谢您的输入! – Michael 2014-11-06 20:23:12

+0

@Michael框架是框架......它们为您提供准系统资料和辅助功能,使工作更轻松,但并没有做到这一切!即使我最喜欢的框架Symfony,也没有一个完美的方式来处理文件上传,因为有很多首选的方法来实现它。由于您正在使用CI,因此可以使用CI提供的后帮助函数替换'$ _POST'变量。如果你觉得这个答案对你有帮助或者解决了你的问题,请将其标记为正确:) – sjagr 2014-11-06 20:26:46

+0

我知道一个框架的含义:)但它不会是我第一次构建一个复杂的功能我自己一个星期后才发现,这个函数已经被框架提供了,但是我没有找到它(因为什么原因):) – Michael 2014-12-02 14:24:31