Comment définir une valeur pour une entrée de fichier en HTML?

Réponses:

525

Vous ne pouvez pas, pour des raisons de sécurité.

Imaginer:

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

Vous ne voulez pas que les sites Web que vous visitez puissent le faire, n'est-ce pas? =)

BalusC
la source
Pouvez-vous l'effacer? Cela me dérange que le nom du fichier soit mémorisé à chaque fois que je revisite. Pelase voir stackoverflow.com/questions/41807471/…
Mawg dit réintégrer Monica le
1
Je comprends le problème de sécurité, mais le navigateur ne devrait-il pas être en mesure de faire la distinction entre un chemin de fichier local dangereux et quelque chose de plus anodin comme dataUrl? C'est peut-être un rêve de pipe.
Cowlinator
5
Qu'en est-il de la fonction glisser-déposer, aucun moyen de définir ce fichier sur le champ de saisie?
Vedmant
1
@Vedmant Oui, vous pouvez définir la valeur de l'élément de fichier avec un événement glisser / déposer sur d'autres éléments. Voir Comment définir la valeur d'entrée de fichier par programme (par exemple: lors du glisser-déposer de fichiers)?
Samuel Liew
129

Tu ne peux pas.

La seule façon de définir la valeur d'une entrée de fichier est par l'utilisateur de sélectionner un fichier.

Cela se fait pour des raisons de sécurité. Sinon, vous seriez en mesure de créer un JavaScript qui télécharge automatiquement un fichier spécifique à partir de l'ordinateur du client.

Guffa
la source
51

Pas une réponse à votre question (à laquelle d'autres ont répondu), mais si vous voulez avoir une fonctionnalité d'édition d'un champ de fichier téléchargé, ce que vous voulez probablement faire est:

  • afficher la valeur actuelle de ce champ en imprimant simplement le nom de fichier ou l'URL, un lien cliquable pour le télécharger, ou s'il s'agit d'une image: il suffit de l'afficher, éventuellement sous forme de miniature
  • la <input>balise pour télécharger un nouveau fichier
  • une case à cocher qui, lorsqu'elle est cochée, supprime le fichier actuellement téléchargé. notez qu'il n'y a aucun moyen de télécharger un fichier «vide», vous avez donc besoin de quelque chose comme ça pour effacer la valeur du champ
Wim
la source
1
Je pense que c'est ce dont j'ai besoin. Si je souhaite modifier les informations sur le produit (je ne souhaite pas modifier l'image du produit), comment dois-je définir l' <input type="file" />image du produit existante? Je peux montrer l'image existante dans une <img />balise mais lorsque je soumets, le fichier ne passe pas.
Partho63
37

Tu ne peux pas. Et c'est une mesure de sécurité. Imaginez si quelqu'un écrit un JS qui définit la valeur d'entrée du fichier dans un fichier de données sensible?

Eimantas
la source
10

Comme tout le monde ici l'a déclaré: Vous ne pouvez pas télécharger un fichier automatiquement avec JavaScript.

TOUTEFOIS! Si vous avez accès aux informations que vous souhaitez envoyer dans votre code (c.-à-d. Pas à passwords.txt), vous pouvez le télécharger en tant que type blob , puis le traiter comme un fichier.

Ce que le serveur finira par voir ne pourra pas être distingué de quelqu'un qui définit réellement la valeur de <input type="file" />. L'astuce, finalement, est de commencer une nouvelle XMLHttpRequest () avec le serveur ...

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

Alors, pourquoi pourriez-vous utiliser cela? Je l'utilise pour télécharger des éléments de toile HTML5 au format jpg. Cela évite à l'utilisateur d'avoir à ouvrir un file inputélément, uniquement pour sélectionner l'image locale en cache qu'il vient de redimensionner, de modifier, etc. Mais cela devrait fonctionner pour tout type de fichier.

HoldOffHunger
la source
1

1) Le problème de la valeur par défaut dans une entrée de fichier N'EST PAS "fait pour des raisons de sécurité", mais les navigateurs "n'ont tout simplement pas réussi à l'implémenter, sans raison valable": voir ce rapport détaillé

2) Une solution simple peut être d'utiliser une entrée de texte au-dessus de l'entrée de fichier, comme ici . Bien sûr, vous avez besoin de code pour envoyer le fichier, en utilisant maintenant la valeur en entrée de texte et non l'entrée de fichier.

Dans mon cas, en faisant une application HTA, ce n'est pas un problème, je n'utilise pas du tout de formulaire.

msillano
la source
-4

Définissez en html:

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

En JS:

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

Après:

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

En fait, nous pouvons le faire. nous pouvons définir la valeur par défaut du fichier en utilisant le contrôle webbrowser en c # à l'aide de la bibliothèque FormToMultipartPostData. Nous devons télécharger et inclure cette bibliothèque dans notre projet. Webbrowser permet à l'utilisateur de naviguer dans les pages Web à l'intérieur du formulaire. Une fois la page Web chargée, le script à l'intérieur du webBrowser1_DocumentCompleted sera exécuté. Alors,

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

Reportez-vous au lien ci-dessous pour le téléchargement et la référence complète.

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

uma
la source
3
À quelle langue est-ce destiné? Ce n'est pas du javascript.
John