表单提交/表单提交错误后填写文件输入

时间:2014-11-06 19:57:52

标签: php forms codeigniter

我是一个混合使用默认输入(文本,选择等)和文件上传(<input type="file">)的多部分表单。

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

我还没有找到解决方案的问题:如果用户选择了一个图片但是错过了填写另一个必填字段(比如“name”),那么表单验证类会阻止请求并显示给客户的错误信息。

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

我尝试过不同的事情:

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

还花时间在网上找到解决方案,但没有成功。

1 个答案:

答案 0 :(得分:5)

在服务器端,您无法获得有关该文件位于客户端计算机上的 的任何信息,因此在用户成功上传图像但用户未填写的情况下正确地删除其余字段,您必须完全省略input type="file"字段,但保留文件在服务器上的位置。有几种方法可以解决这个问题,但这一切都涉及获取上传文件的绝对位置,并且:

  1. 使用<input type="hidden" name="uploadedFile" value="<?php echo $absPath; ?>" />将其作为隐藏值插回,然后检查是否存在$_POST['uploadedFile']并正确使用它。但这不是一个可靠的想法,因为您现在正在向最终用户公开服务器路径(使您自己受到恶意攻击。)
  2. 启动会话并在$_SESSION变量中保存绝对路径,同时向用户显示重新尝试表单中的简单令牌。
  3. 我坚持使用方法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.'" />';
    

    并使用

    隐藏文件上传部分
    if (empty($_SESSION['uploadedFile'][$formToken]))
        echo // <input type="file" output here...
    

    最后在您的表单提交代码中,在尝试使用formToken加载$_FILES['image']之前检查是否存在isset($_POST['formToken'])值,并使用以下方法处理:

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

    的Bam!现在你有了绝对的文件路径,好像文件像以前一样上传了。

    由于您没有提供足够的代码,我只能给您足够的指导来帮助您入门,但这应该足够了。