Как мне заставить пользователя загружать определенное количество изображений одновременно в веб-приложение?

#javascript #html #node.js #multi-upload

#javascript #HTML #node.js #многократная загрузка

Вопрос:

У меня есть веб-приложение, написанное на Node, js, где я хочу, чтобы пользователь мог отправлять свои изображения, если он сделал определенное количество снимков с помощью своих мобильных телефонов, например, 20 снимков (они не могут отправить больше или меньше). Я знаю, что могу собрать изображение в html, используя следующую строку, но не совсем понимаю, как обеспечить выполнение правила загрузки только в том случае, если пользователь использовал правило x изображений.

 <input type="file" accept="image/*" capture="user">
  

Комментарии:

1. Используете ли вы node.js библиотека загрузки файлов?

Ответ №1:

Простейшее решение

Вы можете получить количество файлов, выбранных во входных данных, просто из input.files.length .

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

Если вы не ES6 пользователь, ознакомьтесь с приведенным ниже фрагментом. Кроме того, ознакомьтесь с разделом дальнейшего чтения внизу этого ответа.

 const theInput = document.getElementById('theInput');
const theChooser = document.getElementById('theChooser');

let theNumber; //Or "let theNumber = your-default-number" if you want to avoid possible error when user selected 0 files

theChooser.oninput = () => {
  theNumber = theChooser.value * 1 //Multiplying it to 1 will make the (already number) input a number anyways
}

theInput.onchange = () => {
  theInput.files.length === theNumber ? theFunction() : theWarning()
  // To do nothing when user selected 0 files (user clicked Cancel) do this
  /*
  theInput.files.length === theNumber ? theFunction() : theInput.files.length === 0 ? null : theWarning()
  */
}

function theFunction() {
  console.log(`You chose exactly ${theNumber} files. Yay!`);
}

function theWarning() {
  console.log(`¯\_(ツ)_/¯ Watcha doing, you told to choose only ${theNumber} files.`);
}  
 <input type="number" id="theChooser" placeholder="Set your number of files">
<br>
<input type="file" id="theInput" multiple>  

Не знаком с ES6, посмотрите этот фрагмент. Сравнение обоих фрагментов поможет вам ознакомиться с ES6.

 const theInput = document.getElementById('theInput');
const theChooser = document.getElementById('theChooser');

let theNumber; //Or "let theNumber = your-default-number" if you want to avoid possible errors when user selected 0 files

theChooser.addEventListener('input', function() {
  theNumber = theChooser.value * 1; //Multiplying it to 1 will make the (already number) input a number anyways
})

theInput.addEventListener('change', function() {
  if (theInput.files.length === theNumber) {
    theFunction();
  } else {
    theWarning();
  }
  // To do nothing when user selected 0 files (user clicked Cancel) do this
  /*
  if (theInput.files.length === theNumber) {
    theFunction();
  } else if (theInput.files.length === 0) {
  } else {
    theWarning();
  }
  */
})

function theFunction() {
  console.log("You chose exactly "   theNumber   " files. Yay!");
}

function theWarning() {
  console.log("¯\_(ツ)_/¯ Watcha doing, you told to choose only "   theNumber   " files.");
}  
 <input type="number" id="theChooser" placeholder="Set your number of files">
<br>
<input type="file" id="theInput" multiple>  

Дальнейшее чтение

Комментарии:

1. Именно то, что я искал, и к тому же очень простое. Спасибо!

Ответ №2:

Чтобы разрешить загрузку нескольких файлов, вам придется включить multiple атрибут в input тег.

 <input type="file" accept="image/*" capture="user" multiple="true" id="file-inp" />
  

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

 $('#file-inp').change(function() {
    var files = $(this)[0].files;
    if(files.length != 20){
        alert("only a total of 20 files should be uploaded");
    }
    //enter code here
});
  

Ответ №3:

Вы можете ссылаться на образец как, вам нужно использовать ключевое слово ‘multiple’ в HTML как,

 <input type="file" name="userPhoto" multiple />
  

ИМХО, Multer — один из хороших пакетов npm для обработки загрузки файлов.
Вы можете настроить нет. файлов, которые вы хотите разрешить загружать

  var upload = multer({ storage : storage }).array('userPhoto',20);
  

Пример узла.JS code

 var bodyParser = require("body-parser");
var multer = require('multer');
var app = express();

app.use(bodyParser.json());

var storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    callback(null, file.fieldname   '-'   Date.now());
  }
});

var upload = multer({ storage : storage }).array('userPhoto',20); // here you can set file limit to upload

app.get('/',function(req,res){
      res.sendFile(__dirname   "/index.html");
});

app.post('/api/photo',function(req,res){
    upload(req,res,function(err) {
        //console.log(req.body);
        //console.log(req.files);
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
});

app.listen(3000,function(){
    console.log("Working on port 3000");
});