Загрузка файла Nodejs

Node.js внешний интерфейс сервер Express

Автор должен использовать функцию загрузки файлов при использовании NODEJS для выполнения проекта. После поиска многих учебных пособий в Интернете я нашел экспресс-промежуточное программное обеспечение для обработкиmultipart/form-dataТип данных формы, вы можете легко сохранить данные файла в форме на сервер.

представлять

multer — промежуточное ПО для загрузки файлов node.js, которое разработано на основе busboy.Загружаемые данные формы должны бытьmultipart/form-dataтип, в противном случае будет сообщено об ошибке. ​

простое использование

определить память

В качестве промежуточного программного обеспечения Multer может легко настроить каталог загружаемых файлов и имя сохраненного файла. Сначала рассмотрим простейшее использование.демо1 адрес:

var express = require('express');
var multer = require('multer');
var app = express();

var upload = multer({
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './uploads/');
        },
        filename: function (req, file, cb) {
            //file.originalname上传文件的原始文件名
            var changedName = (new Date().getTime())+'-'+file.originalname;
            cb(null, changedName);
        }
    })
});

Сначала мы создали объект загрузки. Функция назначения в этом объекте используется для определения папки, в которой хранится загруженный файл; функция имени файла используется для изменения имени загруженного файла, хранящегося на сервере. Здесь мы добавляем метку времени провести простое различие. Обе эти функции реализованы через функции обратного вызова. Эти две функции будут вызываться один раз для каждой загрузки. Если загружается несколько файлов, эти две функции будут вызываться несколько раз. Последовательность вызова заключается в том, чтобы сначала вызвать пункт назначения, а затем вызвать имя файла.

В обеих функциях будетfileОбъект, представляющий загруженный в данный момент файловый объект, имеет следующие свойства:

  • fieldname: загруженное имя поля
  • originalname: имя загруженного файла
  • encoding: тип кодировки файла
  • mimetype: MIME-тип файла.

Приложение: Некоторые часто используемые типы MIME

Определить обратный вызов маршрута

//单个文件上传
app.post('/upload/single',upload.single('singleFile'),(req,res)=>{
    console.log(req.file);
    res.json({
        code: '0000',
        type:'single',
        originalname: req.file.originalname
    })
});

//多个文件上传
app.post('/upload/multer',upload.array('multerFile'),(req,res)=>{
    console.log(req.files);
    let fileList = [];
    req.files.map((elem)=>{
        fileList.push({
            originalname: elem.originalname
        })
    });
    res.json({
        code: '0000',
        type:'multer',
        fileList:fileList
    });
});

При определении функции обратного вызова маршрута в экспрессе добавьте определенный объект загрузки в качестве промежуточного программного обеспечения. Если это один файл, используйтеsingleметод, если есть несколько файлов, используйтеarrayоба метода должны передавать имя поля, определенное на странице.

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

  • fieldname: загруженное имя поля
  • originalname: имя загруженного файла
  • encoding: тип кодировки файла
  • mimetype: MIME-тип файла.
  • назначение: сохраненный каталог (такой же, как имя каталога в функции обратного вызова назначения)
  • имя файла: имя сохраненного файла (такое же, как имя файла в функции обратного вызова имени файла)
  • path: относительный путь для сохранения
  • размер: размер файла (единица измерения: байт)

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

Гибридная загрузка

Иногда нам может понадобиться использовать имена полей для разделения загружаемых файлов, например, при загрузке нескольких изображений могут быть удостоверения личности и аватары. Хотя его можно разделить на два интерфейса, это создаст ряд других проблем. Multer поддерживает разделение имен полей для изображений.демо3 адрес

//多字段名上传
let multipleFields = upload.fields([
    {name:'avatar'},
    {name:'gallery', maxCount:3},
]);
app.post('/upload/fields', (req,res)=>{
    multipleFields(req,res,(err) => {
        console.log(req.files);
        if(!!err){
            console.log(err.message);
            res.json({
                code: '2000',
                type: 'field',
                msg:err.message
            })
            return;
        }
        var fileList = [];
        for(let item in req.files){
            var fieldItem = req.files[item];
            fieldItem.map((elem) => {
                fileList.push({
                    fieldname: elem.fieldname,
                    originalname: elem.originalname
                })
            });
        }
        res.json({
            code: '0000',
            type: 'field',
            fileList: fileList,
            msg:''
        })
    });
});

здесь тожеreq.filesатрибут, но этот атрибут не массив, а сложный объект.В этом объекте есть несколько атрибутов, каждое имя атрибута является именем поля, и под каждым атрибутом находится массив, а под массивом находится объект файла, структура примерно такая:

{
    "avatar":[{
        fieldname: "",
        originalname: ""
        //...
    }],
    "gallery":[{
        fieldname: "",
        originalname: ""
        //...
    }]
}

Отфильтровать загружаемые файлы

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

фильтрация по типам файлов

var upload = multer({
    //...其他代码
    fileFilter: function(req, file, cb){
        if(file.mimetype == 'image/png'){
            cb(null, true)
        } else {
            cb(null, false)
        }
    }
});

При определении памяти добавляется новая функция fileFilter для фильтрации ненужных нам файлов.В функции обратного вызова мы передаем true/false, чтобы указать, нужно ли сохранять; если передано false, то функция назначения и функция имени файла также не будут называться.

Размер файла и числовая фильтрация

var upload = multer({
    //...其他代码
    limits:{
        //限制文件大小10kb
        fileSize: 10*1000,
        //限制文件数量
        files: 5
    }
});

При определении хранилища добавьте объект лимитов для управления выгружаемой информацией со следующими свойствами:

  • fieldNameSize: максимальная длина имени поля, значение по умолчанию: 100 байт.
  • fieldSize: максимальная длина значения поля, значение по умолчанию: 1 МБ
  • fields: максимальное количество нефайловых полей
  • fileSize: в составной форме максимальная длина файла (в байтах).
  • файлы: В составной форме максимальное количество файлов
  • частей: В составной форме максимальное количество частей для передачи (поля + файлы)

Здесь мы устанавливаем значение fileSize на меньшее значение, устанавливаем его на 10 КБ, чтобы облегчить тест, чтобы увидеть эффект, но если на этот раз вы обнаружите, что есть ошибка. Поскольку размер загруженного файла может легко превысить 10 КБ, что приведет к ошибке, нам необходимо зафиксировать ошибку в обратном вызове маршрутизации.

//单个文件上传
let singleUpload = upload.single('singleFile');
app.post('/upload/single',(req,res)=>{
    singleUpload(req,res,(err)=>{
        if(!!err){
            console.log(err.message)
            res.json({
                code: '2000',
                type:'single',
                originalname: '',
                msg: err.message
            })
            return;
        }
        if(!!req.file){
            res.json({
                code: '0000',
                type:'single',
                originalname: req.file.originalname,
                msg: ''
            })
        } else {
            res.json({
                code: '1000',
                type:'single',
                originalname: '',
                msg: ''
            })
        }
    });
});

//多个文件上传
let multerUpload = upload.array('multerFile');
app.post('/upload/multer', (req,res)=>{
    multerUpload(req,res,(err)=>{
        if(!!err){
            res.json({
                code: '2000',
                type:'multer',
                fileList:[],
                msg: err.message
            });
        }
        let fileList = [];
        req.files.map((elem)=>{
            fileList.push({
                originalname: elem.originalname
            })
        });
        res.json({
            code: '0000',
            type:'multer',
            fileList:fileList,
            msg:''
        });
    });
});

Весь демо-код здесьсклад. Если вы думаете, что это хорошо написано, пожалуйста, следуйте за мнойДомашняя страница Наггетс. Для получения дополнительных статей, пожалуйста, посетитеадрес моего блога