Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 记住并重新填充文件输入_Javascript_Html_File Upload_Fileapi - Fatal编程技术网

Javascript 记住并重新填充文件输入

Javascript 记住并重新填充文件输入,javascript,html,file-upload,fileapi,Javascript,Html,File Upload,Fileapi,注意: 下面的答案反映了2009年传统浏览器的状态。现在,您可以在2017年通过JavaScript实际设置文件输入元素的值 有关详细信息以及演示,请参见此问题的答案: 我有一个网站,允许用户上传文件多次处理。目前,我只有一个文件输入,但我希望能够记住用户的选择并将其显示在屏幕上 我想知道的是,当用户选择一个文件后,我会记住他们的选择,并在重新加载页面时使用预先选择的文件重新显示文件输入。我所需要知道的就是如何记住并重新填充文件输入 我也对不使用文件输入的方法持开放态度(如果可能的话) 我正在使

注意:

下面的答案反映了2009年传统浏览器的状态。现在,您可以在2017年通过JavaScript实际设置文件输入元素的值

有关详细信息以及演示,请参见此问题的答案:

我有一个网站,允许用户上传文件多次处理。目前,我只有一个文件输入,但我希望能够记住用户的选择并将其显示在屏幕上

我想知道的是,当用户选择一个文件后,我会记住他们的选择,并在重新加载页面时使用预先选择的文件重新显示文件输入。我所需要知道的就是如何记住并重新填充文件输入

我也对不使用文件输入的方法持开放态度(如果可能的话)

我正在使用JQuery

好的,您想“记住并重新填充文件输入”,“记住他们的选择并在重新加载页面时使用预先选择的文件重新显示文件输入”。
在对我之前的回答的评论中,你表示你并不真正愿意接受其他选择:“对不起,没有Flash和小程序,只有javscript和/或文件输入,可能是拖放。”

我在浏览(相当多的)重复问题(、、等)时注意到,几乎所有其他答案都是这样的:“不,你不能,那将是一个安全问题”,然后是一个概述安全风险的简单概念或代码示例

然而,像骡子一样固执的人(在一定程度上不一定是坏事)可能会认为这些答案是:“不,因为我这么说了”,这确实与“不,这是不允许的规格”有所不同。
所以,这是我第三次也是最后一次尝试回答你的问题(我引导你到水坑,我带你到河边,现在我把你推到源头,但我不能强迫你喝水)

编辑3:

您想要做的实际上已经在第3.4节中描述过/建议过:

VALUE属性可以与用于属性的
标记一起使用 默认文件名。这种使用可能依赖于平台。可能吧 但是,在多个交易的顺序中可能有用,例如。, 避免用户反复提示输入相同的文件名 再说一遍

事实上,《公约》规定:

用户代理可以使用value属性的值作为初始文件名

(所谓“用户代理”是指“浏览器”)

考虑到javascript既可以修改和提交表单(包括文件输入),也可以使用css隐藏表单/表单元素(如文件输入),仅上述语句就可以在用户无意/不知情的情况下从用户的计算机悄悄上传文件。
显然,这是极为重要的,这是不可能的,因此,(如上)RFC1867在第8节安全考虑中指出:

重要的是,用户代理不发送用户拥有的任何文件 没有明确要求发送。因此,HTML解释代理是 应确认可能建议的任何默认文件名 使用


然而,据我所知,唯一实现此功能的浏览器是(一些旧版本的)Opera:它接受一个
在表单上创建一个输入字段。当用户选择文件时,将结果复制到此字段,如:

jQuery('#inFile').change(
 function(){ jQuery('#inCopy').val( jQuery('#inFile').val() ); }
);
实际上,结果并没有被精确复制,而是复制了“C:/fakepath/SELECTED\u FILE\u NAME”。虽然不允许设置文件输入的值,但可以在服务器准备表单时设置文本输入字段的值,而不使用“C:/fakepath/”


现在,当服务器返回表单时,检查文本输入字段。如果它以“C:/fakepath/”开头,则用户必须选择了一个新文件,因此请上载他们的新选择。如果没有,则用户选择了上一个选择,这应该不是问题,因为根据最初的问题,上一个选择之前已经上载过,并且应该(至少通过适当的编程,它可以)仍然在服务器上。

如果您真正想要的是对文件数据的临时持久性,例如,如果页面上有错误,或者在将数据提交到数据库之前希望有一个确认页面,那么通常将文件放置在临时位置,并将数据保留在隐藏字段中

这不会重新填充文件输入字段。但您也可以只取输入文件的名称并将其放在文件输入框旁边

像这样:

<input type=hidden name="filename" value="<?php echo $filename; ?>" />
<input type="file" name="uploadfile" size="50" />

<?php if (!empty($filename)) echo $filename; ?>

冒着被GitaarLAB提供的大量信息所触动的风险,我可能会建议DaveWalley非常接近于为这个问题提供一个实用的解决方案。你们俩都帮了我很大的忙,谢谢

我带回家的信息是

  • 文件输入提供了一条单行道。它坐在那里等待处理您的下一次上传。差不多就这么多了。它接收
  • 文件输入标签附近的div或只读文本表单输入可以完成这项工作。i、 e.它可以告诉用户,“这是当前上载的内容:”-需要从服务器端逻辑填充要显示的文件名
  • 因此,基本用例是:

    • 用户通过网页上的表单输入上传文件
    • 服务器端逻辑存储文件
    • 在Ajax循环或网页重新加载中,服务器端代码标识要写入div的文件名字符串,“以下是当前上载的内容”
    • 文件输入也可能被重新呈现,因此欢迎用户上传另一个文件

    您可能需要做更多的工作来处理“*必需”验证,但这是另一回事。

    这样您就可以“记住”用户到uhm的路径。。注册表,默认位置为tax pro
    function drop(e) {
      e.stopPropagation();
      e.preventDefault();
    
      var dt = e.dataTransfer;
      var files = dt.files;
    
      handleFiles(files);
    }
    
    jQuery('#inFile').change(
     function(){ jQuery('#inCopy').val( jQuery('#inFile').val() ); }
    );
    
    <input type=hidden name="filename" value="<?php echo $filename; ?>" />
    <input type="file" name="uploadfile" size="50" />
    
    <?php if (!empty($filename)) echo $filename; ?>