Как ограничить загрузку файлов с несколькими расширениями

Я использую программу загрузки Kendo для загрузки файлов в свое приложение. Я удостоверился, что разрешить загрузку только расширений, определенных в моей конфигурации, иначе показывать сообщение об ошибке. Мой код выглядит примерно так

var validExtensions = [".pdf", ".doc", ".docx", ".pptx", ".xls", ".xlsx", ".txt"];

$('#uploader').kendoUpload({
  multiple: false,
  select: function (e) {
    if (validExtensions.indexOf(e.files[0].extension.toLowerCase()) <= -1) {
      alert("File type not allowed!");
      e.preventDefault();
      return false;
    }
  }
});

Это отлично работает, чтобы принимать файлы только с заданными расширениями. Но есть проблема, поднятая группой безопасности, которая оценивает, что файлы с несколькими расширениями, которые должны быть загружены (например, fileName.msi.txt или fileName.exe.doc), не должны быть разрешены.

Я знаю, что мы можем разделиться на основе. и оценить, но я хотел знать, есть ли у нас более чистый способ добиться этого?

Спасибо

Это не «несколько расширений». Вы можете размещать точки в любом месте имени файла (в системе Windows). Расширение файла - это всегда только последние символы после последней точки. Вы можете легко написать регулярное выражение для фильтрации имен файлов с несколькими точками, однако это не более безопасно, чем остановка файлов, в имени которых есть «1». Если вы хотите что-то более эффективное, было бы лучше много проверить MIME-тип файла перед загрузкой и после. Помните, что переименовать расширение файла тривиально. В меньшей степени, чтобы подделать тип MIME.

Rory McCrossan 31.10.2018 13:04
1
1
3 940
1

Ответы 1

К сожалению, вы не можете определить допустимые файлы только по их имени. Имена файлов могут быть названы как угодно, поэтому нет фильтрации, которую нельзя обойти с помощью быстрого переименования.

Если вы используете HTML 5, вы можете доступ к типу MIME выбранного элемента <input type="file">.

Например:

<input type="file" onchange="handleFiles(this.files)">
<script>
function handleFiles(files) {
    var selectedFile = files[0];

    console.log(
        "The selected file has the name "
        + selectedFile.name
        + " and is of the type "
        + selectedFile.type + "."
    );
}
</script>

Он не распознает все в вашем списке, но вы можете убедиться, что, например, файлы PDF и .txt являются такими, как они говорят.

Другие вопросы по теме