How to set a value to a file input in HTML?

How to set a value to a file input in HTML?

Note:
The answers & comments below reflect the state of legacy browsers in 2009. Now you can actually set the value of the file input element dynamically/programatically using JavaScript and a dataTransfer or FileList object in 2017.
See the answer in this question for details as well as a demo:How to set file input value programatically (i.e.: when drag-dropping files)?

How can I set the value of this?

Solutions/Answers:

Solution 1:

You cannot due to security reasons.

Imagine:

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

You don’t want the websites you visit to be able to do this, do you? =)

Solution 2:

You can’t.

The only way to set the value of a file input is by the user to select a file.

This is done for security reasons. Otherwise you would be able to create a Javascript that automatically uploads a specific file from the clients computer.

Solution 3:

Not an answer to your question (which others have answered), but if you want to have some edit functionality of an uploaded file field, what you probably want to do is:

  • show the current value of this field by just printing the filename or URL, a clickable link to download it, or if it’s an image: just show it, possibly as thumbnail
  • the <input> tag to upload a new file
  • a checkbox that, when checked, deletes the currently uploaded file. note that there’s no way to upload an ’empty’ file, so you need something like this to clear out the field’s value

Solution 4:

You can’t. And it’s a security measure. Imagine if someone writes a JS that sets file input value into some sensitive data file?

Solution 5:

As everyone else here has stated: You cannot upload a file automatically with JavaScript.

HOWEVER! If you have access to the information you want to send in your code (i.e., not passwords.txt), then you can upload it as a blob-type, and then treat it as a file.

What the server will end up seeing will be indistinguishable from someone actually setting the value of <input type="file" />. The trick, ultimately, is to begin a new XMLHttpRequest() with the server…

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?'});

Solution 6:

1) The problem of default value in a file input IS NOT “done for security reasons”, but the browsers “just failed to implement it, for no good reason”: see this deep report

2) A simple solution can be to use a text input on top of file input, like here. Of course you need some code to send the file, using now the value in text input and not the file input.

In my case, doing HTA application, that is not a problem, I don’t use form at all.

Best regard
m.s.