【问题标题】:Changing the value of input file更改输入文件的值
【发布时间】:2013-03-13 00:41:00
【问题描述】:

以下两个问题澄清了input file的值由于安全原因不能更改。

在 PHP 中,在验证表单时,一种常用的方法是重新填写在单击 submit 按钮之前提供的 input text 中输入的值,以便客户端知道他插入了什么,或者简单地说保留字段中的值,这是客户所期望的。 (他不必每次出现特定错误时都重新填写表格。

所以我们使用以下内容:

<input type="text" name="title" id="title" maxlength="100" value="<?php echo htmlspecialchars($title);?>" />

所以由于我无法更改input file 的值,所以我可以使用提供的路径$image['tmp_name'] 重新填充它,这意味着客户端必须重新上传(或重新浏览)每个图像验证出错时,是否有任何可能的方法来保持该值?

【问题讨论】:

  • 好吧,首先,在提交之前进行验证(但不可靠,所以不要相信它),然后“禁止”您确实收到的下载并保留对文件,告诉用户您将在重新提交时维护该文件。然后,每隔一段时间,删除从未移动到适当位置的文件。
  • 您可以使用 javascript 验证来阻止表单在有效之前发布。
  • 或者... base64 对文件源进行编码,将其发送回表单中的hidden 字段,并在返回时取消编码?显然,对于非常大的文件,这不是一个好主意,因此需要进行一些完整性检查。

标签: php html input


【解决方案1】:

您可以存储文件而不考虑表单中的其他验证错误(显然仅当文件本身有效时),然后将文件上传字段替换为文件详细信息(例如列出文件名和大小)。

实际上,与其替换该字段,我建议让他们选择在其位置上传不同的文件(如果他们愿意)。

【讨论】:

  • 如果其他输入无效,我不想存储文件(如果他没有注册,我不想插入新用户的个人资料图片 - 如果其他输入无效'无效)。
  • 您可以将文件存储在临时位置,直到注册完成,此时您将其移动到通常的位置,并设置一个任务以定期从该临时目录中删除文件。但要完全按照您的要求进行操作 - 只需将路径放回现场 - 是不可能的。
【解决方案2】:

将上传的文件存储在服务器上。

生成一个复选框,其值引用与该文件关联的 id。默认勾选。

如果用户不想重复使用同一个文件,请告诉他们取消选中它。

【讨论】:

  • 存储文件并不是一件很紧急的事情,如果其他输入未验证,我不想存储它,只需将路径保留在输入文件中即可。但是看起来input file 就像验证码一样,它会在回发后重新生成(变为空)。
  • 您不能将路径保留在文件输入中,这就是您将文件存储在服务器上的原因。这样,不仅保留了值(以迂回的方式),而且文件不需要重复上传。
【解决方案3】:

使用 javascript,您可以阻止提交表单,直到所有字段都得到验证。

我推荐包含jQuery Validation Engine 教程。 demos

您还可以使用jQuery file upload 为图片上传器添加一些样式。

当然,某些字段必须在服务器上进行验证,这就是您可以使用验证引擎发布 ajax 请求的原因。

"ajaxUserCall": {
    "url": "ajaxValidateFieldUser",
    "extraData": "name=eric",
    "alertText": "* This user is already taken",
    "alertTextOk": " * User is valid",
    "alertTextLoad": "* Validating, please wait"
},

一些没有重定向或刷新的服务器端验证示例:Demo

【讨论】:

  • 问题不在于验证,问题是当我在服务器上验证时(检查数据库是否已在使用电子邮件 - 检查用户名是否可用),并返回错误消息(此用户名不可用),input file 中的路径不见了,我无法保留它的值。
  • 是的,当页面刷新时。
  • 使用 javascript 可以防止页面被提交,因此不会刷新页面:验证是在客户端进行的(您可以使用 ajax 帖子在服务器上分别验证用户名和电子邮件)。如果您不想使用javascript,我这样做的唯一方法是进行两步注册:1)用户名+密码+电子邮件; 2)所有其他信息
  • 我更新了帖子,但这里有一个例子说明我在说什么:position-relative.net/creation/formValidator/demos/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2011-08-08
  • 2020-08-31
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多