Як встановити значення для введення файлу в HTML?


337

Як я можу встановити значення цього?

<input type="file" />

3
Я відповів про це повним посиланням і актуальною (грудень 2013 р.) Тут: Запам’ятайте та перенаселяйте введення файлів
GitaarLAB

Відповіді:


525

Ви не можете з міркувань безпеки.

Уявіть собі:

<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? Можливо, це труба-мрія.
ковбасник

5
А що з функцією перетягування n drop, не спосіб встановити цей файл у поле введення?
Ведмант

1
@Vedmant Так, ви можете встановити значення елемента файлу за допомогою події перетягування / падіння для інших елементів. Див. Розділ Як програмно встановити значення введення файлу (тобто: при перетягуванні файлів)?
Самуель Liew

129

Ви не можете.

Єдиний спосіб встановити значення вхідного файлу - це користувач вибрати файл.

Це робиться з міркувань безпеки. Інакше ви зможете створити JavaScript, який автоматично завантажує певний файл з комп'ютера клієнта.


51

Не відповідь на ваше запитання (на що відповіли інші), але якщо ви хочете мати певну функцію редагування завантаженого файлового поля, ви, ймовірно, хочете зробити це:

  • покажіть поточне значення цього поля, просто надрукувавши ім’я файлу чи URL-адресу, інтерактивне посилання для завантаження, або якщо це зображення: просто покажіть його, можливо, як мініатюру
  • <input>тег , щоб завантажити новий файл
  • прапорець, який, якщо встановлений прапорець, видаляє завантажений файл. зауважте, що немає можливості завантажити "порожній" файл, тому вам потрібно щось подібне, щоб очистити значення поля

1
Я думаю, що це те, що мені потрібно. Якщо я хочу редагувати інформацію про продукт (не хочу змінювати зображення продукту), як мені встановити <input type="file" />існуючий образ продукту? Я можу показати наявне зображення в <img />тезі, але коли я не надсилаю файл, це проходить.
Partho63

37

Ви не можете. І це міра безпеки. Уявіть, якщо хтось пише JS, який встановлює значення вхідного файлу у якийсь файл чутливих даних?


10

Як і всі інші тут заявили: Ви не можете завантажувати файл автоматично за допомогою 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) Простим рішенням може бути використання введення тексту поверх введення файлу, як тут . Звичайно, вам потрібен код, щоб надіслати файл, використовуючи тепер значення введення тексту, а не введення файлу.

У моєму випадку, якщо робити 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

Насправді ми можемо це зробити. ми можемо встановити значення файлу за замовчуванням за допомогою керування веб-браузером у c # за допомогою бібліотеки FormToMultipartPostData. Нам потрібно завантажити та включити цю бібліотеку до нашого проекту. 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


3
Для чого це мова? Це не JavaScript.
Іван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.