如何为HTML输入的文件设置值?


337

注意:

以下答案与评论反映了2009年旧版浏览器的状态。现在,您实际上可以在2017年使用JavaScript和dataTransfer或FileList对象动态/以编程方式设置文件输入元素的值。

有关详细信息和演示,请参见此问题的答案:
如何以编程方式设置文件输入值(即:拖放文件时)?

如何设置此值?

<input type="file" />

3
我在此处对此进行了完整的引用和最新(2013年12月)答复:记住并
重新填充

Answers:


524

由于安全原因,您不能。

想像:

<form name="foo" method="post" enctype="multipart/form-data">
    <input type="file" value="c:/passwords.txt">
</form>
<script>document.foo.submit();</script>

您不希望所访问的网站能够做到这一点,对吗?=)


你能清除吗?每次重新访问时都会记住该文件名,这使我感到烦恼。Pelase看到stackoverflow.com/questions/41807471/...
Mawg说起用莫妮卡

1
我了解安全性问题,但浏览器是否应该能够区分危险的本地文件路径和诸如dataUrl之类的无害内容?也许这是一个白日梦。
cowlinator

5
拖放功能怎么办,无法将文件设置为输入字段?
Vedmant

1
@Vedmant是的,您可以通过在其他元素上进行拖放事件来设置文件元素的值。请参阅如何以编程方式设置文件输入值(即:拖放文件时)?
塞缪尔·柳

如果这不起作用,那么....该代码段如何知道我将密码保存在哪里?
HoldOffHunger

129

你不能

设置文件输入值的唯一方法是用户选择文件。

出于安全原因这样做。否则,您将能够创建自动从客户端计算机上载特定文件的Javascript。


51

不是您的问题的答案(其他人都回答了),但是如果您希望对上传的文件字段具有某些编辑功能,则可能需要做的是:

  • 通过仅打印文件名或URL,可下载的可下载链接或图像,即可显示该字段的当前值:仅显示它,可能显示为缩略图
  • <input>标签上传新文件
  • 一个复选框,选中该复选框将删除当前上传的文件。请注意,无法上传“空”文件,因此您需要使用类似方法清除字段的值

1
我认为这就是我所需要的。如果要编辑产品信息(不想更改产品图像),应如何设置<input type="file" />为现有产品图像?我可以在<img />标签中显示现有图像,但是提交时没有文件通过。
Partho63 '19

37

你不能 这是一种安全措施。想象一下,如果有人编写了将文件输入值设置为敏感数据文件的JS?


9

正如这里的其他所有人所说:您不能使用JavaScript自动上传文件。

然而! 如果您有权访问要在代码中发送的信息(即,没有passwords.txt),则可以将其作为blob类型上载,然后将其视为文件。

服务器最终将看到的内容与实际设置的值没有区别<input type="file" />。最终,诀窍是从服务器开始一个新的XMLHttpRequest()。

function uploadFile (data) {
        // define data and connections
    var blob = new Blob([JSON.stringify(data)]);
    var url = URL.createObjectURL(blob);
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'myForm.php', true);

        // define new form
    var formData = new FormData();
    formData.append('someUploadIdentifier', blob, 'someFileName.json');

        // action after uploading happens
    xhr.onload = function(e) {
        console.log("File uploading completed!");
    };

        // do the uploading
    console.log("File uploading started!");
    xhr.send(formData);
}

    // This data/text below is local to the JS script, so we are allowed to send it!
uploadFile({'hello!':'how are you?'});

那么,您可能将其用于什么呢? 我用它来将HTML5画布元素上传为jpg。这为用户省去了打开file input元素,仅选择刚刚调整大小,修改等的本地缓存图像的麻烦。但是,它适用于任何文件类型。


1

1)文件输入中的默认值问题不是“出于安全原因而完成”,但浏览器“只是出于没有充分的理由而未能实现”:请参阅此深入报告

2)一个简单的解决方案是在文件输入的顶部使用文本输入,例如here。当然,您需要一些代码来发送文件,现在使用文本输入中的值而不是文件输入。

就我而言,做HTA应用程序不是问题,我根本不使用表格。


-4

在html中定义:

<input type="hidden" name="image" id="image"/>

在JS中:

ajax.jsonRpc("/consulta/dni", 'call', {'document_number': document_number})
    .then(function (data) {
        if (data.error){
            ...;
        }
        else {
            $('#image').val(data.image);
        }
    })

后:

<input type="hidden" name="image" id="image" value="/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8U..."/>
<button type="submit">Submit</button>

-8

实际上我们可以做到。我们可以使用FormToMultipartPostData库在c#中使用webbrowser控件来将文件值设置为默认值。我们必须下载该库并将其包含在我们的项目中。Webbrowser使用户可以导航表单内的网页。加载网页后,将执行webBrowser1_DocumentCompleted内部的脚本。所以,

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
       FormToMultipartPostData postData = 
            new FormToMultipartPostData(webBrowser1, form);
        postData.SetFile("fileField", @"C:\windows\win.ini");
        postData.Submit();
    }

请参考以下链接进行下载和完整参考。

https://www.codeproject.com/Articles/28917/Setting-a-file-to-upload-inside-the-WebBrowser-com


2
这是什么语言?不是javascript。
约翰,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.