414

How can I set the value of this?

<input type="file" />
HoldOffHunger
  • 15,349
  • 8
  • 79
  • 115
Alon Gubkin
  • 54,770
  • 52
  • 188
  • 285
  • 3
    I did a full referenced and up-to date (dec 2013) answer about this here: [Remember and Repopulate File Input](http://stackoverflow.com/a/20537822/588079) – GitaarLAB Dec 16 '13 at 03:26
  • 1
    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](http://jkorpela.fi/forms/file.html) 2) A simple solution can be to use a text input on top of file input, [like here](https://stackoverflow.com/a/13468539/7715532). 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. – msillano Feb 08 '19 at 12:24

8 Answers8

626

You cannot set it to a client side disk file system path, 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? =)

You can only set it to a publicly accessible web resource as seen in this answer, but this is clearly not the same as a client side disk file system path and it's therefore useless in that context.

BalusC
  • 1,040,783
  • 362
  • 3,548
  • 3,513
163

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 client's computer.

HoldOffHunger
  • 15,349
  • 8
  • 79
  • 115
Guffa
  • 666,277
  • 106
  • 705
  • 986
  • 1
    And what if I want to set the value of file input to some generated content (not from disk) ? – Eugene Mala Mar 15 '21 at 23:28
  • 1
    @EugeneMala: The value of the file input is a file that the user has selected. You can't put any other content in the value. – Guffa Mar 18 '21 at 18:25
61

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
Wim
  • 10,833
  • 38
  • 56
  • 3
    I think this is what I need. If I **want to edit product information (don't want to change the product image), how should I set `` to existing product image?** I can show existing image in an `` tag but when I submit not file is passing. – Partho63 Jul 29 '19 at 12:13
  • @Partho63 Why do you want to upload again? If that is because of form mandatory field validation, you can somehow mark file input not required if image was already uploaded. – mangatinanda Feb 03 '21 at 10:57
41

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

HoldOffHunger
  • 15,349
  • 8
  • 79
  • 115
Eimantas
  • 48,240
  • 16
  • 132
  • 164
29

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

HOWEVER! If you have access to the information you want to send in your code (i.e., not C:\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?'});

So, what could you possibly use this for? I use it for uploading HTML5 canvas elements as jpg's. This saves the user the trouble of having to open a file input element, only to select the local, cached image that they just resized, modified, etc.. But it should work for any file type.

HoldOffHunger
  • 15,349
  • 8
  • 79
  • 115
  • This is exactly the point: you don't try to manipulate a "classic" HTML form submit (and set files dynamically on the input), but submit the whole form via JS (including other input fields for text, etc.). In the end, there is a single JS based request (POST), and not a single "classic" submit. I guess many readers of this thread are here exactly because of this information. – Grimm Jan 26 '22 at 17:23
14

I have write full example for load URL to input file, and preview enter image description here you can check here 1 https://vulieumang.github.io/vuhocjs/file2input-input2file/

in short you can use this function

function loadURLToInputFiled(url){
  getImgURL(url, (imgBlob)=>{
    // Load img blob to input
    // WIP: UTF8 character error
    let fileName = 'hasFilename.jpg'
    let file = new File([imgBlob], fileName,{type:"image/jpeg", lastModified:new Date().getTime()}, 'utf-8');
    let container = new DataTransfer(); 
    container.items.add(file);
    document.querySelector('#file_input').files = container.files;
    
  })
}
// xmlHTTP return blob respond
function getImgURL(url, callback){
  var xhr = new XMLHttpRequest();
  xhr.onload = function() {
      callback(xhr.response);
  };
  xhr.open('GET', url);
  xhr.responseType = 'blob';
  xhr.send();
}
  • This is a beautiful design of code. I can use this even with data:image which is amazing for what I'm use this for. Question: Is it hard to edit your code to allow for multiple image urls? That would be amazing! Look forward to your reply and maybe edit to include haha – aussiedan May 18 '22 at 14:13
  • That's crazy, the top 4 answers claim it's not possible (with 600+ votes) while this answer does it so elegantly, it worked so well for my use-case – Omri Luzon May 18 '22 at 17:45
  • @aussiedan your mean is want load multi image url to 1 input or many input? – Đinh Tiến Vũ May 19 '22 at 15:57
  • 1
    @OmriLuzon you welcome :). I take a ton of time to find way to do that, I hope many people can find it – Đinh Tiến Vũ May 19 '22 at 15:58
  • @OmriLuzon yeah, so I use the same FileList for multiple images. So one FileList shows image1,image2 and so on. As the above code only passes one image? – aussiedan May 23 '22 at 09:06
-6

Define in html:

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

In JS:

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

After:

<input type="hidden" name="image" id="image" value="/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8U..."/>
<button type="submit">Submit</button>
djperalta
  • 183
  • 2
  • 3
  • 1
    It looks like you're uploading the value of an HTML element with an ajax call. That is very different from setting the value of an `input type="file"` element. – HoldOffHunger Mar 31 '21 at 14:30
-14

Actually we can do it. we can set the file value default by using webbrowser control in c# using FormToMultipartPostData Library.We have to download and include this Library in our project. Webbrowser enables the user to navigate Web pages inside form. Once the web page loaded , the script inside the webBrowser1_DocumentCompleted will be executed. So,

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

Refer the below link for downloading and complete reference.

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

uma
  • 5
  • 1
  • 3