Подтвердить что ты не робот

Ограничить размер загрузки файла (html-ввод)

Я хотел бы просто ограничить размер файла, который пользователь может загрузить.

Я думал maxlength = 20000 = 20k, но это, похоже, не работает вообще.

Я запускаю Rails, а не PHP, но думал, что было бы гораздо проще сделать это на стороне клиента в HTML/CSS или в качестве последнего средства, использующего jQuery. Это настолько базово, что должен быть некоторый HTML-тег, который я пропускаю или не знаю.

Ищете поддержку IE7 +, Chrome, FF3.6+. Полагаю, я мог бы уйти, просто поддерживая IE8 +, если это необходимо.

Спасибо.

4b9b3361

Ответ 1

Вы не можете сделать это на стороне клиента. Вам придется сделать это на сервере.

Редактировать: Этот ответ устарел!

На момент этого редактирования HTML файл API в основном поддерживается во всех основных браузерах.

Я бы предоставил обновление с решением, но @mark.inman.winning уже сделал это.

Имейте в виду, что даже если теперь возможно выполнить проверку на клиенте, вы все равно должны проверить его на сервере. Все проверки на стороне клиента могут быть обойдены.

Ответ 2

Это вполне возможно. Используйте Javascript.

Я использую jQuery для выбора элемента ввода. Я настроил это на событие изменения.

$("#aFile_upload").on("change", function (e) {

    var count=1;
    var files = e.currentTarget.files; // puts all files into an array

    // call them as such; files[0].size will get you the file size of the 0th file
    for (var x in files) {

        var filesize = ((files[x].size/1024)/1024).toFixed(4); // MB

        if (files[x].name != "item" && typeof files[x].name != "undefined" && filesize <= 10) { 

            if (count > 1) {

                approvedHTML += ", "+files[x].name;
            }
            else {

                approvedHTML += files[x].name;
            }

            count++;
        }
    }
    $("#approvedFiles").val(approvedHTML);

});

Приведенный выше код сохраняет все имена файлов, которые я считаю достойными сохранения на странице отправки, до того, как произойдет отправка. Я добавляю "утвержденные" файлы во входной элемент val с помощью jQuery, чтобы при отправке формы отправлялись имена файлов, которые я хочу сохранить. Все файлы будут отправлены, однако теперь на стороне сервера мы должны их отфильтровать. Я еще не написал никакого кода для этого, но используйте свое воображение. Я предполагаю, что это можно сделать с помощью цикла for и сопоставить имена, отправленные из поля ввода, и сопоставить их с переменной $ _FILES (PHP Superglobal, извините, я не знаю переменную файла ruby).

Суть в том, что вы можете проверять файлы перед отправкой. Я делаю это и затем выводю его пользователю, прежде чем он/она отправит форму, чтобы сообщить им, что они загружают на мой сайт. Все, что не соответствует критериям, не отображается обратно пользователю, и поэтому они должны знать, что слишком большие файлы не будут сохранены. Это должно работать во всех браузерах, потому что я не использую объект FormData.

Ответ 3

var uploadField = document.getElementById("file");

uploadField.onchange = function() {
    if(this.files[0].size > 2097152){
       alert("File is too big!");
       this.value = "";
    };
};

Этот пример должен работать нормально. Я установил его примерно на 2 МБ, 1 МБ в байтах равен 1 048 576, так что вы можете умножить его на необходимый вам лимит.

Вот пример jsfiddle для большей ясности:
https://jsfiddle.net/7bjfr/808/

Ответ 4

Посмотрите на фрагмент кода ниже ↓

const input = document.getElementById('input')

input.addEventListener('change', (event) => {
  const target = event.target
  	if (target.files && target.files[0]) {

      /*Maximum allowed size in bytes
        5MB Example
        Change first operand(multiplier) for your needs*/
      const maxAllowedSize = 5 * 1024 * 1024;
      if (target.files[0].size > maxAllowedSize) {
      	// Here you can ask your users to load correct file
       	target.value = ''
      }
  }
})
<input type="file" id="input" />

Ответ 5

<script type="text/javascript">
    $(document).ready(function () {

        var uploadField = document.getElementById("file");

        uploadField.onchange = function () {
            if (this.files[0].size > 300000) {
                this.value = "";
                swal({
                    title: 'File is larger than 300 KB !!',
                    text: 'Please Select a file smaller than 300 KB',
                    type: 'error',
                    timer: 4000,
                    onOpen: () => {
                        swal.showLoading()
                        timerInterval = setInterval(() => {
                            swal.getContent().querySelector('strong')
                                .textContent = swal.getTimerLeft()
                        }, 100)
                    },
                    onClose: () => {
                        clearInterval(timerInterval)

                    }
                }).then((result) => {
                    if (
                        // Read more about handling dismissals
                        result.dismiss === swal.DismissReason.timer


                    ) {

                        console.log('I was closed by the timer')
                    }
                });

            };
        };



    });
</script>

Ответ 6

Пример видеофайла (HTML + Javascript):

<form action="some_script" method="post" enctype="multipart/form-data">
<input id="max_id" type="hidden" name="MAX_FILE_SIZE" value="250000000" />
<input onchange="upload_check()" id="file_id" type="file" name="file_name" accept="video/*" />
<input type="submit" value="Upload"/>
</form>

<script>
function upload_check()
{
    var upl = document.getElementById("file_id");
    var max = document.getElementById("max_id").value;

    if(upl.files[0].size > max)
    {
       alert("File too big!");
       upl.value = "";
    }
};
</script>