HTML: Як обмежити завантаження файлу лише зображеннями?


126

Як за допомогою HTML можна обмежити, які файли файлів можна завантажити?

Щоб полегшити роботу користувача, я хочу обмежити завантаження файлів лише зображеннями (jpeg, gif, png).

<form method="post" action="..." enctype="multipart/form-data">
<label for="image">Photo</label>
<input name="image" type="file" />
</form>

Очевидно, щоб правильно це забезпечити - я б перевірив на стороні бекенда / сервера. Але все, що я шукаю, - це спосіб просто користувальницької роботи, щоб після натискання кнопки «переглянути» знайти зображення, яке вони хочуть завантажити, їм не доведеться бачити всі ці текстові документи тощо, які не стосуються upload
JacobT

Я не знаю, що ви можете встановити маску файлу. Я ніколи не бачив, щоб це було успішно виконано.
Роберт К

Відповіді:


230

HTML5 каже <input type="file" accept="image/*">. Звичайно, ніколи не довіряйте валідації на стороні клієнта: Завжди перевіряйте ще раз на стороні сервера ...


87

Введення файлу HTML5 має атрибут accept, а також декілька атрибутів. За допомогою декількох атрибутів ви можете завантажувати кілька зображень в екземпляр.

<input type="file" multiple accept='image/*'>

Ви також можете обмежити кілька типів mime.

<input type="file" multiple accept='image/*|audio/*|video/*' >

та інший спосіб перевірки типу mime за допомогою файлового об’єкта.

файловий об’єкт дає ім'я, розмір та тип.

var files=e.target.files;

var mimeType=files[0].type; // You can get the mime type

Ви також можете обмежити користувача для завантаження деяких типів файлів за вказаним вище кодом.


4
image/*|audio/*|video/*не працює для мене, це повинно бути відокремлено комою, здається:image/*,video/mp4,.txt
serg

Відмінно підходить для перевірки mimeType! Тх!
Педро Феррейра

6

Відредаговано

Якби все було таким, яким вони мали би бути, це можна зробити за допомогою атрибута "Прийняти".

http://www.webmasterworld.com/forum21/6310.htm

Однак браузери в значній мірі ігнорують це, тому це нерелевантно. Коротка відповідь: я не думаю, що існує спосіб зробити це в HTML. Вам доведеться перевірити це на стороні сервера.

Наступний старіший пост містить деяку інформацію, яка може допомогти вам у пошуку альтернатив.

Введення файлу атрибут 'accept' - це корисно?


6

Ось HTML для завантаження зображень. За замовчуванням файли зображень відображатимуться лише у вікні перегляду, оскільки ми поставили accept="image/*". Але ми все одно можемо змінити його зі спадного меню, і він покаже всі файли. Отже, частина Javascript перевіряє, чи є обраний файл фактичним зображенням.

 <div class="col-sm-8 img-upload-section">
     <input name="image3" type="file" accept="image/*" id="menu_images"/>
     <img id="menu_image" class="preview_img" />
     <input type="submit" value="Submit" />
 </div> 

Тут на події зміни ми спочатку перевіряємо розмір зображення. А у другій ifумові ми перевіряємо, чи це файл зображень чи ні.

this.files[0].type.indexOf("image")буде, -1якщо це не файл зображення.

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Додайте пояснення, будь ласка.
Пол Швець

Зауважте, що вищезазначене вимагає jquery, але це не так. Досить просто зрозуміти, але корисно заявити. Я створив для цього загадку . Він робить і інші речі (як це потрібно для проекту), але концепція дуже однакова.
Дейв Ленд

2
<script>

    function chng()
    {
        var typ=document.getElementById("fiile").value;
        var res = typ.match(".jp");

        if(res)
        {
            alert("sucess");
        }
        else
        {
            alert("Sorry only jpeg images are accepted");
            document.getElementById("fiile").value="; //clear the uploaded file
        }
    }

</script>

Тепер у частині html

<input type="file" onchange="chng()">

цей код перевірить, чи є завантажений файл файлом jpg чи ні, і обмежує завантаження інших типів


Ця перевірка спрощена простим перейменуванням розширення файлу. Вам слід принаймні перевірити тип URI даних, якщо ви збираєтесь робити щось подібне.
Лукас Леблан

1

Це можна зробити надійно лише на стороні сервера. Використання атрибута "прийняти" добре, але його також слід перевірити на стороні сервера, щоб користувачі не могли обмежуватися вашим сценарієм без обмежень.

Я пропоную вам: відкинути будь-який файл із зображенням, попередити користувача та повторно відобразити форму.


0

Зрештою, фільтр, який відображається у вікні Огляд, встановлюється браузером. Ви можете вказати всі потрібні фільтри в атрибуті Accept, але ви не маєте гарантії, що браузер вашого користувача буде його дотримуватися.

Ваша найкраща ставка - зробити якусь фільтрацію в задньому куті на сервері.


0

Оформити замовлення проекту під назвою Uploadify. http://www.uploadify.com/

Це завантажувач файлів на базі Flash + jQuery. Тут використовується діалогове вікно вибору файлів Flash, яке дає можливість фільтрувати типи файлів, обирати декілька файлів одночасно тощо.


30
Спалах? ... ніяк!
ErickBest

14
Найгірше рішення коли-небудь.
Маттео Москоні

1
Хлопці, я не бачу, чому це найгірше рішення коли-небудь. Хоча справжній Flash зникне, він все ще використовується старими браузерами - дуже старий, добре, але все ще використовується - і це рішення має обидва типи технологій: jQuery + HTML5 та резервна копія Flash. Це так само добре, як VideoJS, у якому є резервна копія Flash у випадку, якщо браузер не може відтворити відео ... Я не перевірив рішення, воно може бути не найкращим, але відгуки не справедливі.
Унапедра

1
+1 Нерозумно, щоб проголосувати. Flash спалахує, але має хороший запас. Як ви думаєте, що Google використовує для gmail для резервної передачі сокета? Нерозумно.
Джейсон Себрінг

8
Ця відповідь - 4 роки. На той час підтримка HTML5 для вибору декількох файлів або фільтрування вікна вибраного файлу за прийнятими типами не підтримувалась в жодному з основних браузерів. Це було рішення, яке б працювало для багатьох на той час, але зараз я б рухався до чистого рішення HTML5.
AndrewR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.