From d4cfe0bc2ff95a1fd14124beb848b20e7db8f356 Mon Sep 17 00:00:00 2001 From: Tanya Sandoval Date: Tue, 17 Apr 2018 19:35:32 +0100 Subject: [PATCH 001/103] updated readme with example on how to link to html multipart form --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index b1b321fd..f432761a 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,32 @@ app.post('/profile', upload.array(), function (req, res, next) { }) ``` +Here's an example on how this links to an HTML form. Suppose we have a form group with enctype="multipart/form-data" as follows: + +```html +
+
+ + + +
+
+``` + +Then in your javascript file you would add these lines to access both the file and the body: + +```javascript +var multer = require('multer') +var upload = multer({ dest: './public/data/uploads/' }) +app.post('/stats', upload.single('uploaded_file'), function (req, res) { + // req.file is the name of your file in the form above, here 'uploaded_file' + // req.body will hold the text fields, if there were any + console.log(req.file, req.body) +}); +``` + + + ## API ### File information From 3b349bb461c0b87364e11804d16446c9e15f6b69 Mon Sep 17 00:00:00 2001 From: yepbug Date: Thu, 11 Apr 2019 18:30:57 +0800 Subject: [PATCH 002/103] Fix broken link in Readme --- doc/README-zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 788db1ca..8105c57c 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -232,7 +232,7 @@ function fileFilter (req, file, cb) { 当遇到一个错误,multer 将会把错误发送给 express。你可以使用一个比较好的错误展示页 ([express标准方式](http://expressjs.com/guide/error-handling.html))。 -如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 [Multer 错误](https://github.com/expressjs/multer/blob/master/lib/make-error.js#L1-L9),你可以使用 `multer` 对象下的 `MulterError` 类 (即 `err instanceof multer.MulterError`)。 +如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 [Multer 错误](https://github.com/expressjs/multer/blob/master/lib/multer-error.js),你可以使用 `multer` 对象下的 `MulterError` 类 (即 `err instanceof multer.MulterError`)。 ```javascript var multer = require('multer') From 6aebad35d3bf3ab87809cede5651304939d23bd8 Mon Sep 17 00:00:00 2001 From: Serge Osipof Date: Wed, 17 Apr 2019 17:47:36 +0300 Subject: [PATCH 003/103] Add unit for fieldSize in busboy limit params --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 759a0a10..8b2920d0 100644 --- a/README.md +++ b/README.md @@ -233,7 +233,7 @@ The following integer values are available: Key | Description | Default --- | --- | --- `fieldNameSize` | Max field name size | 100 bytes -`fieldSize` | Max field value size | 1MB +`fieldSize` | Max field value size (in bytes) | 1MB `fields` | Max number of non-file fields | Infinity `fileSize` | For multipart forms, the max file size (in bytes) | Infinity `files` | For multipart forms, the max number of file fields | Infinity From 5c902e5342996b2785288507b3d47d9773554a53 Mon Sep 17 00:00:00 2001 From: Dzhanavapp <41441695+dzhanavapp@users.noreply.github.com> Date: Mon, 22 Apr 2019 01:25:52 +0300 Subject: [PATCH 004/103] Fix mistake MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix mistake in word "файЛ" --- doc/README-ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index 76c3bd80..56bfcc08 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -116,7 +116,7 @@ var upload = multer({ dest: 'uploads/' }) #### `.single(fieldname)` -Принимает один файо с именем `fieldname`. Файл будет сохранен в `req.file`. +Принимает один файл с именем `fieldname`. Файл будет сохранен в `req.file`. #### `.array(fieldname[, maxCount])` From ac7922b7ae8edbbac84f60c5de9fff262332d67f Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 5 Jul 2019 16:02:46 -0700 Subject: [PATCH 005/103] chore: Update testdata-w3c-json-form Version 1.0.0 of testdata-w3c-json-form contains a correction to the test data. Without the correction (of the bottle-on-wall type from an array of numbers to an array of strings), it is possible that tests will break in Node.js 13.0.0 or a future release. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 920ab10e..a8e76951 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "mocha": "^3.5.3", "rimraf": "^2.4.1", "standard": "^11.0.1", - "testdata-w3c-json-form": "^0.2.0" + "testdata-w3c-json-form": "^1.0.0" }, "engines": { "node": ">= 0.10.0" From 67670cd5ffc5f4c2cd857b24d5a896b5aab0c0c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Tue, 16 Jul 2019 11:11:10 +0100 Subject: [PATCH 006/103] history: 1.4.2 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a43c1ad5..dccc7de5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.2 - 2019-07-16 + +- Docs: Add Russian translation for README (#662) +- Docs: Patch zh-CN README base on newest README (#670) +- Docs: Fix broken link in Readme (#679) +- Docs: Fix broken link in Chinese Readme (#730) +- Docs: Fix typo in Russian README (#738) +- Docs: Add unit for fieldSize in busboy limit params (#734) +- Internal: Make unit tests comaptible with Node.js 13.x (#752) + ## 1.4.1 - 2018-10-11 - Bugfix: Make sure that req.file.buffer always is a Buffer From 59376904cf2317b3683368c8cbe3736356ffacd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Tue, 16 Jul 2019 11:11:20 +0100 Subject: [PATCH 007/103] version: 1.4.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8e76951..21dc96a9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.1", + "version": "1.4.2", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From 21c8838ac25fa1b186a76ae9843976f2bb64f66f Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:46:25 -0300 Subject: [PATCH 008/103] Create README-pt-br.md --- doc/README-pt-br.md | 280 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 doc/README-pt-br.md diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md new file mode 100644 index 00000000..77016ddc --- /dev/null +++ b/doc/README-pt-br.md @@ -0,0 +1,280 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. Está escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. + +**NOTA**: Multer não processará nenhum formulário que não seja multipart (`multipart/form-data`). + +## Traduções + +Este README também está disponível em outros idiomas: + +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +- [English](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (English) + +## Instalação + +```sh +$ npm install --save multer +``` + +## Uso + +Multer adiciona um objeto `body` e um `file` ou objeto `files` para objeto `request`. O objeto `body` contém os valores dos campos de texto do formulário, o objeto `file` ou `files` contém os arquivos enviados por meio do formulário. + +Exemplo de uso básico: + +Não esqueça o `enctype="multipart/form-data"` em seu formulário. + +```html +
+ +
+``` + +```javascript +var express = require('express') +var multer = require('multer') +var upload = multer({ dest: 'uploads/' }) + +var app = express() + +app.post('/profile', upload.single('avatar'), function (req, res, next) { + // req.file is the `avatar` file + // req.body will hold the text fields, if there were any +}) + +app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { + // req.files is array of `photos` files + // req.body will contain the text fields, if there were any +}) + +var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', cpUpload, function (req, res, next) { + // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files + // + // e.g. + // req.files['avatar'][0] -> File + // req.files['gallery'] -> Array + // + // req.body will contain the text fields, if there were any +}) +``` + +Caso você precise lidar com forumário text-only multipart, você deve usar o método `.none()`: + +```javascript +var express = require('express') +var app = express() +var multer = require('multer') +var upload = multer() + +app.post('/profile', upload.none(), function (req, res, next) { + // req.body contains the text fields +}) +``` + +## API + +### Informação de arquivo + +Cada arquivo contém as seguintes informações: + +Key | Descrição | Nota +--- | --- | --- +`fieldname` | Nome do campo especificado no formulário | +`originalname` | Nome do arquivo no computador do usuário | +`encoding` | Tipo de codificação do arquivo | +`mimetype` | Tipo Mime do arquivo | +`size` | Tamanho do arquivo em bytes | +`destination` | A pasta na qual o arquivo foi salvo | `DiskStorage` +`filename` | O nome do arquivo dentro do `destination` | `DiskStorage` +`path` | O caminho completo para o arquivo enviado | `DiskStorage` +`buffer` | O `Buffer` do arquivo inteiro | `MemoryStorage` + +### `multer(opts)` + +Multer aceita um objeto de opções, a propriedade mais básico dos é o`dest`, que diz ao Multer onde fazer o upload dos arquivos. No caso de você omitir o objeto de opções, os arquivos serão mantidos na memória e nunca gravados no disco. + +Por padrão, Multer irá renomear os arquivos para evitar conflitos de nomes. A função de renomeação pode ser personalizada de acordo com suas necessidades. + +A seguir estão as opções que podem ser passadas para Multer. + +Key | Descrição +--- | --- +`dest` ou `storage` | Onde armazenar os arquivos +`fileFilter` | Função para controlar quais arquivos são aceitos +`limits` | Limites dos dados enviados +`preservePath` | Mantenha o caminho completo dos arquivos em vez de apenas o nome base + +Em um web app basico, somente `dest` pode ser necessário, e configurado como mostrado em +o exemplo a seguir. + +```javascript +var upload = multer({ dest: 'uploads/' }) +``` + +Se você quiser mais controle sobre seus envios, você vai querer usar a opção `storage` +em vez de `dest`. Multer vem com motores de armazenamento `DiskStorage` +e `MemoryStorage`; Mais mecanismos estão disponíveis de terceiros. + +#### `.single(fieldname)` + +Aceite um único arquivo com o nome `fieldname`. O arquivo único será armazenado +em `req.file`. + +#### `.array(fieldname[, maxCount])` + +Aceite múltiplos arquivos, todos com o nome `fieldname`. Opcionalmente, erro se mais de `maxCount` forem enviados. O array de arquivos serão armazenados em +`req.files`. + +#### `.fields(fields)` + +Aceite uma mistura de arquivos, especificada por `fields`. Um objeto com array de arquivos +será armazenado em `req.files`. + +`fields` deve ser uma matriz de objetos com `name` e opcionalmente um `maxCount`. +Exemplo: + +```javascript +[ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 } +] +``` + +#### `.none()` + +Aceite apenas campos de texto. Se algum upload de arquivo for feito, erro com código +"LIMIT\_UNEXPECTED\_FILE" será emitido. + +#### `.any()` + +AAceita todos os arquivos que são enviaos. Uma matriz de arquivos será armazenada em +`req.files`. + +**AVISO:** Certifique-se de sempre manipular os arquivos que um usuário envia. +Nunca adicione multer como global middleware já que um usuário mal-intencionado poderia fazer upload de arquivos para uma rota que você não previu. Use esta função apenas nas rotas +onde você está lidando com os arquivos enviados. + +### `storage` + +#### `DiskStorage` + +O mecanismo de armazenamento em disco oferece controle total sobre o armazenamento de arquivos em disco. + +```javascript +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + cb(null, file.fieldname + '-' + Date.now()) + } +}) + +var upload = multer({ storage: storage }) +``` + +Existem duas opções disponíveis, `destination` e `filename`. Ambas são funções que determinam onde o arquivo deve ser armazenado. + +`destination` é usado para determinar em qual pasta os arquivos enviados devem ser armazenados. Isso também pode ser dado como uma `string` (e.g. `'/tmp/uploads'`). Se não é dada `destination`, o diretório padrão do sistema operacional para arquivos temporários é usado. + +**Nota:** Você é responsável por criar o diretório ao fornecer "destino" como uma função. Ao passar uma string, o multer se certificará de que o diretório foi criado para você. + +`filename` ié usado para determinar qual arquivo deve ser nomeado dentro da pasta. +Se não é dada `filename`, Cada arquivo receberá um nome aleatório que não inclui nenhuma extensão de arquivo. + +**Nota:** Multer não adicionará nenhuma extensão de arquivo para você, sua função deve retornar um nome de arquivo completo com uma extensão de arquivo. + +Cada função é passada pelo request (`req`) e algumas informações sobre o arquivo (`file`) para ajudar com a decisão. + +Observe que `req.body` pode não ter sido totalmente preenchido ainda. Depende do +ordenar que o cliente transmita campos e arquivos para o servidor. + +#### `MemoryStorage` + +O mecanismo de armazenamento de memória armazena os arquivos na memória como um objeto `Buffer`. Não tem opções. +```javascript +var storage = multer.memoryStorage() +var upload = multer({ storage: storage }) +``` +Ao usar o armazenamento de memória, as informações do arquivo conterão um campo chamado +`buffer` que contém o arquivo inteiro. + +**AVISO**: Fazer upload de arquivos muito grandes ou arquivos relativamente pequenos em grande número muito rapidamente pode fazer com que o aplicativo fique sem memória quando o armazenamento de memória é usado. + +### `limits` + +Um objeto que especifica os limites de tamanho das seguintes propriedades opcionais. Multer passa esse objeto diretamente para o busboy, e os detalhes das propriedades podem ser encontrados em [busboy's page](https://github.com/mscdex/busboy#busboy-methods). + +Os seguintes valores inteiros estão disponíveis: + +Key | Descrição | Padrão +--- | --- | --- +`fieldNameSize` | Tamanho máximo do nome de campo| 100 bytes +`fieldSize` | Tamanho máximo do valor do campo (in bytes) | 1MB +`fields` | Max number of non-file fields | Infinity +`fileSize` | Para formulários multipart, o tamanho máximo do arquivo (in bytes) | Infinity +`files` | Para formulários multipart, o número máximo de campos de arquivos | Infinity +`parts` | Para formulários multipart, o número máximo de parts (fields + files) | Infinity +`headerPairs` | Para formulários multipart, o número máximo do header key=>value, para analisar | 2000 + +A especificação dos limites pode ajudar a proteger seu site contra ataques de negação de serviço (DoS). + +### `fileFilter` + +Defina isso para uma função para controlar quais arquivos devem ser enviados e quais devem ser ignorados. +A função deve ficar assim: + +```javascript +function fileFilter (req, file, cb) { + + // A função deve chamar `cb` com um booleano + // to indicate if the file should be accepted + + // Para rejeitar este arquivo passe `false`, assim: + cb(null, false) + + // Para aceitar o arquivo passe `true`, assim: + cb(null, true) + + // Você sempre pode passar um erro se algo der errado: + cb(new Error('I don\'t have a clue!')) + +} +``` + +## Error handling + +Quando encontrar um erro, Multer delegará o erro para Express. Você pode +exibir uma boa página de erro usando [the standard express way](http://expressjs.com/guide/error-handling.html). + +Se você quer pegar erros especificamente do Multer, você pode enviar para o +função de middleware . Além disso, se você quiser pegar apenas [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), você pode usar o `MulterError` classe que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). + +```javascript +var multer = require('multer') +var upload = multer().single('avatar') + +app.post('/profile', function (req, res) { + upload(req, res, function (err) { + if (err instanceof multer.MulterError) { + // A Multer error occurred when uploading. + } else if (err) { + // An unknown error occurred when uploading. + } + + // Everything went fine. + }) +}) +``` + +## Mecanismo de armazenamento personalizado + +Para obter informações sobre como criar seu próprio mecanismo de armazenamento, veja [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## License + +[MIT](LICENSE) From 13fb8a86d9e515e91e7615129e7576f6d232d06b Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:47:49 -0300 Subject: [PATCH 009/103] Update README-ko.md --- doc/README-ko.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-ko.md b/doc/README-ko.md index 51e29539..8a76681f 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -10,6 +10,7 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 - [English](https://github.com/expressjs/multer/blob/master/README.md) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) +- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## 설치 From 913738adfb7a3fc07078b8b64af5c4a9fe690dda Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:48:23 -0300 Subject: [PATCH 010/103] Update README-ru.md --- doc/README-ru.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-ru.md b/doc/README-ru.md index 56bfcc08..bce87da6 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -11,6 +11,7 @@ Multer — это middleware для фреймворка express для обра - [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) +- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## Установка From 21412c1e29cabc9866f6c9b295bd9ca5f7201224 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:48:52 -0300 Subject: [PATCH 011/103] Update README-zh-cn.md --- doc/README-zh-cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 8105c57c..ac7ca304 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -13,6 +13,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 - [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) +- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## 安装 From 9efc79b1581809e772b897a7d1f9fca5b548dd22 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:49:15 -0300 Subject: [PATCH 012/103] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8b2920d0..c7f6716f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This README is also available in other languages: - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## Installation From 19d06b28288c0cb460ed35f7577f5ebdc63adf1e Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:49:54 -0300 Subject: [PATCH 013/103] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7f6716f..283db284 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ This README is also available in other languages: - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) -- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## Installation From 1dda22500ff6be78e4fb0aa11fdc4caf2cf0f5e6 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:50:33 -0300 Subject: [PATCH 014/103] Update README-ko.md --- doc/README-ko.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ko.md b/doc/README-ko.md index 8a76681f..12d9999f 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -10,7 +10,7 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 - [English](https://github.com/expressjs/multer/blob/master/README.md) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) -- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## 설치 From bfbbc7ac64cfa80e576e121da470abfa71191aa2 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:50:53 -0300 Subject: [PATCH 015/103] Update README-ru.md --- doc/README-ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index bce87da6..b704a942 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -11,7 +11,7 @@ Multer — это middleware для фреймворка express для обра - [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) -- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## Установка From 30a257ffa649cdcf63d52484b88ae7a6c0461879 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Sat, 3 Aug 2019 19:51:11 -0300 Subject: [PATCH 016/103] Update README-zh-cn.md --- doc/README-zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index ac7ca304..62f3db03 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -13,7 +13,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 - [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) -- [Português] (https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) ## 安装 From 31b8132234d5fd440c8f7e04371dd1a9e92cf7bf Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:21:43 +0200 Subject: [PATCH 017/103] create & init README-ar.md .. --- doc/README-ar.md | 299 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 doc/README-ar.md diff --git a/doc/README-ar.md b/doc/README-ar.md new file mode 100644 index 00000000..8b2920d0 --- /dev/null +++ b/doc/README-ar.md @@ -0,0 +1,299 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written +on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. + +**NOTE**: Multer will not process any form which is not multipart (`multipart/form-data`). + +## Translations + +This README is also available in other languages: + +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) + +## Installation + +```sh +$ npm install --save multer +``` + +## Usage + +Multer adds a `body` object and a `file` or `files` object to the `request` object. The `body` object contains the values of the text fields of the form, the `file` or `files` object contains the files uploaded via the form. + +Basic usage example: + +Don't forget the `enctype="multipart/form-data"` in your form. + +```html +
+ +
+``` + +```javascript +var express = require('express') +var multer = require('multer') +var upload = multer({ dest: 'uploads/' }) + +var app = express() + +app.post('/profile', upload.single('avatar'), function (req, res, next) { + // req.file is the `avatar` file + // req.body will hold the text fields, if there were any +}) + +app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { + // req.files is array of `photos` files + // req.body will contain the text fields, if there were any +}) + +var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', cpUpload, function (req, res, next) { + // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files + // + // e.g. + // req.files['avatar'][0] -> File + // req.files['gallery'] -> Array + // + // req.body will contain the text fields, if there were any +}) +``` + +In case you need to handle a text-only multipart form, you should use the `.none()` method: + +```javascript +var express = require('express') +var app = express() +var multer = require('multer') +var upload = multer() + +app.post('/profile', upload.none(), function (req, res, next) { + // req.body contains the text fields +}) +``` + +## API + +### File information + +Each file contains the following information: + +Key | Description | Note +--- | --- | --- +`fieldname` | Field name specified in the form | +`originalname` | Name of the file on the user's computer | +`encoding` | Encoding type of the file | +`mimetype` | Mime type of the file | +`size` | Size of the file in bytes | +`destination` | The folder to which the file has been saved | `DiskStorage` +`filename` | The name of the file within the `destination` | `DiskStorage` +`path` | The full path to the uploaded file | `DiskStorage` +`buffer` | A `Buffer` of the entire file | `MemoryStorage` + +### `multer(opts)` + +Multer accepts an options object, the most basic of which is the `dest` +property, which tells Multer where to upload the files. In case you omit the +options object, the files will be kept in memory and never written to disk. + +By default, Multer will rename the files so as to avoid naming conflicts. The +renaming function can be customized according to your needs. + +The following are the options that can be passed to Multer. + +Key | Description +--- | --- +`dest` or `storage` | Where to store the files +`fileFilter` | Function to control which files are accepted +`limits` | Limits of the uploaded data +`preservePath` | Keep the full path of files instead of just the base name + +In an average web app, only `dest` might be required, and configured as shown in +the following example. + +```javascript +var upload = multer({ dest: 'uploads/' }) +``` + +If you want more control over your uploads, you'll want to use the `storage` +option instead of `dest`. Multer ships with storage engines `DiskStorage` +and `MemoryStorage`; More engines are available from third parties. + +#### `.single(fieldname)` + +Accept a single file with the name `fieldname`. The single file will be stored +in `req.file`. + +#### `.array(fieldname[, maxCount])` + +Accept an array of files, all with the name `fieldname`. Optionally error out if +more than `maxCount` files are uploaded. The array of files will be stored in +`req.files`. + +#### `.fields(fields)` + +Accept a mix of files, specified by `fields`. An object with arrays of files +will be stored in `req.files`. + +`fields` should be an array of objects with `name` and optionally a `maxCount`. +Example: + +```javascript +[ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 } +] +``` + +#### `.none()` + +Accept only text fields. If any file upload is made, error with code +"LIMIT\_UNEXPECTED\_FILE" will be issued. + +#### `.any()` + +Accepts all files that comes over the wire. An array of files will be stored in +`req.files`. + +**WARNING:** Make sure that you always handle the files that a user uploads. +Never add multer as a global middleware since a malicious user could upload +files to a route that you didn't anticipate. Only use this function on routes +where you are handling the uploaded files. + +### `storage` + +#### `DiskStorage` + +The disk storage engine gives you full control on storing files to disk. + +```javascript +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + cb(null, file.fieldname + '-' + Date.now()) + } +}) + +var upload = multer({ storage: storage }) +``` + +There are two options available, `destination` and `filename`. They are both +functions that determine where the file should be stored. + +`destination` is used to determine within which folder the uploaded files should +be stored. This can also be given as a `string` (e.g. `'/tmp/uploads'`). If no +`destination` is given, the operating system's default directory for temporary +files is used. + +**Note:** You are responsible for creating the directory when providing +`destination` as a function. When passing a string, multer will make sure that +the directory is created for you. + +`filename` is used to determine what the file should be named inside the folder. +If no `filename` is given, each file will be given a random name that doesn't +include any file extension. + +**Note:** Multer will not append any file extension for you, your function +should return a filename complete with an file extension. + +Each function gets passed both the request (`req`) and some information about +the file (`file`) to aid with the decision. + +Note that `req.body` might not have been fully populated yet. It depends on the +order that the client transmits fields and files to the server. + +#### `MemoryStorage` + +The memory storage engine stores the files in memory as `Buffer` objects. It +doesn't have any options. + +```javascript +var storage = multer.memoryStorage() +var upload = multer({ storage: storage }) +``` + +When using memory storage, the file info will contain a field called +`buffer` that contains the entire file. + +**WARNING**: Uploading very large files, or relatively small files in large +numbers very quickly, can cause your application to run out of memory when +memory storage is used. + +### `limits` + +An object specifying the size limits of the following optional properties. Multer passes this object into busboy directly, and the details of the properties can be found on [busboy's page](https://github.com/mscdex/busboy#busboy-methods). + +The following integer values are available: + +Key | Description | Default +--- | --- | --- +`fieldNameSize` | Max field name size | 100 bytes +`fieldSize` | Max field value size (in bytes) | 1MB +`fields` | Max number of non-file fields | Infinity +`fileSize` | For multipart forms, the max file size (in bytes) | Infinity +`files` | For multipart forms, the max number of file fields | Infinity +`parts` | For multipart forms, the max number of parts (fields + files) | Infinity +`headerPairs` | For multipart forms, the max number of header key=>value pairs to parse | 2000 + +Specifying the limits can help protect your site against denial of service (DoS) attacks. + +### `fileFilter` + +Set this to a function to control which files should be uploaded and which +should be skipped. The function should look like this: + +```javascript +function fileFilter (req, file, cb) { + + // The function should call `cb` with a boolean + // to indicate if the file should be accepted + + // To reject this file pass `false`, like so: + cb(null, false) + + // To accept the file pass `true`, like so: + cb(null, true) + + // You can always pass an error if something goes wrong: + cb(new Error('I don\'t have a clue!')) + +} +``` + +## Error handling + +When encountering an error, Multer will delegate the error to Express. You can +display a nice error page using [the standard express way](http://expressjs.com/guide/error-handling.html). + +If you want to catch errors specifically from Multer, you can call the +middleware function by yourself. Also, if you want to catch only [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), you can use the `MulterError` class that is attached to the `multer` object itself (e.g. `err instanceof multer.MulterError`). + +```javascript +var multer = require('multer') +var upload = multer().single('avatar') + +app.post('/profile', function (req, res) { + upload(req, res, function (err) { + if (err instanceof multer.MulterError) { + // A Multer error occurred when uploading. + } else if (err) { + // An unknown error occurred when uploading. + } + + // Everything went fine. + }) +}) +``` + +## Custom storage engine + +For information on how to build your own storage engine, see [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## License + +[MIT](LICENSE) From 2d70575188b4722a210ff45de47156b97b341348 Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:25:29 +0200 Subject: [PATCH 018/103] done arabic translation via README-ar.md .. --- doc/README-ar.md | 225 ++++++++++++++++++++++++----------------------- 1 file changed, 117 insertions(+), 108 deletions(-) diff --git a/doc/README-ar.md b/doc/README-ar.md index 8b2920d0..51ce41e4 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -1,31 +1,41 @@ # Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) -Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written -on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. +
-**NOTE**: Multer will not process any form which is not multipart (`multipart/form-data`). +تعتبر Multer وسيط node.js لمعالجة `multipart/form-data`, والتي تُستخدم أساسًا لتحميل الملفات. تم بناء هذا الوسيط بالإعتماد على [busboy](https://github.com/mscdex/busboy) لأجل الحصول على أقصى قدر من الكفاءة. -## Translations +**ملاحظة**: لن يقوم Multer بمعالجة أي شكل غير متعدد الأجزاء (`multipart/form-data`). -This README is also available in other languages: -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +## الترجمات -## Installation +هذا الملف متاح أيضًا بلغات أخرى: + +- [English](https://github.com/expressjs/multer/blob/master/README.md) (الإنجليزية) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (الصينية) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (الكورية) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (الروسية) + + +## التنصيب + +
```sh $ npm install --save multer ``` -## Usage +
+ +## الاستعمال + +يضيف Multer كائن `body` وكائن `file` أو `files` إلى كائن `request`. يحتوي الكائن `body` على قيم مدخلات النص في الإستمارة ، بينما يحتوي الكائن `file` أو `files` على الملفات التي تم تحميلها عبر الإستمارة. -Multer adds a `body` object and a `file` or `files` object to the `request` object. The `body` object contains the values of the text fields of the form, the `file` or `files` object contains the files uploaded via the form. +مثال على الاستخدام الأساسي: -Basic usage example: +لا تنسَ `enctype="multipart/form-data"` في الإستمارة الخاص بك. -Don't forget the `enctype="multipart/form-data"` in your form. +
```html
@@ -62,7 +72,11 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { }) ``` -In case you need to handle a text-only multipart form, you should use the `.none()` method: +
+ +إذا احتجت لمعالجة إستمارة متعددة الأجزاء للنص فقط ، فيجب عليك استخدام الدالة `.none ()`: + +
```javascript var express = require('express') @@ -74,72 +88,71 @@ app.post('/profile', upload.none(), function (req, res, next) { // req.body contains the text fields }) ``` +
-## API +## واجهة برمجة التطبيقات (API) -### File information +### معلومات الملف -Each file contains the following information: +كل ملف يحتوي على المعلومات التالية: -Key | Description | Note +مفتاح | وصف | ملاحظة --- | --- | --- -`fieldname` | Field name specified in the form | -`originalname` | Name of the file on the user's computer | -`encoding` | Encoding type of the file | -`mimetype` | Mime type of the file | -`size` | Size of the file in bytes | -`destination` | The folder to which the file has been saved | `DiskStorage` -`filename` | The name of the file within the `destination` | `DiskStorage` -`path` | The full path to the uploaded file | `DiskStorage` -`buffer` | A `Buffer` of the entire file | `MemoryStorage` +`fieldname` | اسم المُدخَل المحدد في الإستمارة | +`originalname` | اسم الملف على كمبيوتر المستخدم | +`encoding` | نوع تشفير الملف | +`mimetype` | نوع ملف ملحقات بريد إنترنت متعددة الأغراض ( MIME ) | +`size` | حجم الملف بالبايت | +`destination` | المجلد الذي تم حفظ الملف إليه | `تخزين على الاسطوانة` (`DiskStorage`) +`filename` | اسم الملف داخل "الوجهة" ( `destination` ) | `تخزين على الاسطوانة` (`DiskStorage`) +`path` | المسار الكامل للملف الذي تم تحميله | `تخزين على الاسطوانة` (`DiskStorage`) +`buffer` | "ذاكرة" (`Buffer`) للملف بأكمله | `تخزين على الذاكرة ` (`MemoryStorage`) + -### `multer(opts)` +### `multer(opts)` -Multer accepts an options object, the most basic of which is the `dest` -property, which tells Multer where to upload the files. In case you omit the -options object, the files will be kept in memory and never written to disk. +يقبل Multer كائن الخيارات ، وأهمها خاصية `dest`، والتي تحدد مكان تحميل الملفات. في حال حذفت كائن الخيارات ، سيتم الاحتفاظ بالملفات في الذاكرة ولن تتم كتابتها مطلقًا على القرص. -By default, Multer will rename the files so as to avoid naming conflicts. The -renaming function can be customized according to your needs. +بشكل افتراضي ، سيقوم Multer بإعادة تسمية الملفات لتجنب تعارض الأسماء. يمكن تخصيص وظيفة إعادة التسمية وفقا لاحتياجاتك. -The following are the options that can be passed to Multer. +فيما يلي الخيارات التي يمكن تمريرها إلى Multer: -Key | Description +مفتاح | وصف --- | --- -`dest` or `storage` | Where to store the files -`fileFilter` | Function to control which files are accepted -`limits` | Limits of the uploaded data -`preservePath` | Keep the full path of files instead of just the base name +`dest` أو `storage` | مكان لتخزين الملفات +`fileFilter` | دالة للسيطرة على الملفات التي يتم قبولها +`limits` | حدود البيانات التي تم تحميلها +`preservePath` | الاحتفظ بالمسار الكامل للملفات بدلاً من الاسم الأساسي -In an average web app, only `dest` might be required, and configured as shown in -the following example. +في تطبيق ويب متوسط ​​، قد تكون هناك حاجة فقط إلى `dest`، وتكوينها كما هو موضح في +المثال التالي : + +
```javascript var upload = multer({ dest: 'uploads/' }) ``` -If you want more control over your uploads, you'll want to use the `storage` -option instead of `dest`. Multer ships with storage engines `DiskStorage` -and `MemoryStorage`; More engines are available from third parties. +
+ +إذا كنت تريد مزيدًا من التحكم في عمليات التحميل ، فستحتاج إلى استخدام خيار `storage` بدلاً من `dest`. يأتي Multer مع محركات التخزين `DiskStorage` و` MemoryStorage` ؛ كما تتوفر المزيد من المحركات من أطراف ثالثة. #### `.single(fieldname)` -Accept a single file with the name `fieldname`. The single file will be stored -in `req.file`. +قبول ملف واحد باسم `اسم-المُدخَل`. سيتم تخزين الملف في `req.file`. #### `.array(fieldname[, maxCount])` -Accept an array of files, all with the name `fieldname`. Optionally error out if -more than `maxCount` files are uploaded. The array of files will be stored in -`req.files`. +قبول مصفوفة من الملفات ، وكلها تحمل اسم `اسم-المُدخَل`. يظهر خطأ اختياريً إذا تم تحميل ملفات أكثر من `maxCount`. سيتم تخزين مصفوفة الملفات في `req.files`. #### `.fields(fields)` -Accept a mix of files, specified by `fields`. An object with arrays of files -will be stored in `req.files`. +قبول مزيج من الملفات ، المحدد بواسطة `المدخلات`. سيتم تخزين كائن مع مصفوفات من الملفات في `req.files`. -`fields` should be an array of objects with `name` and optionally a `maxCount`. -Example: +يجب أن تكون `المدخلات` عبارة عن مصفوفة من الكائنات التي توفر بشكل اساسي `name` واختيارياً `maxCount`. +مثال: + +
```javascript [ @@ -148,26 +161,25 @@ Example: ] ``` +
+ #### `.none()` -Accept only text fields. If any file upload is made, error with code -"LIMIT\_UNEXPECTED\_FILE" will be issued. +قبول المدخلات النصية فقط. في حالة رفع أي ملف ، سيتم إصدار خطأ بشيفرة "LIMIT \_UNEXPECTED \_FILE". #### `.any()` -Accepts all files that comes over the wire. An array of files will be stored in -`req.files`. +قبول جميع الملفات التي تأتي عبر السلك. سيتم تخزين مصفوفة من الملفات في `req.files`. -**WARNING:** Make sure that you always handle the files that a user uploads. -Never add multer as a global middleware since a malicious user could upload -files to a route that you didn't anticipate. Only use this function on routes -where you are handling the uploaded files. +**تحذير:** تأكد من أنك تعالج دائمًا الملفات التي يقوم المستخدم بتحميلها. لا تقم أبداً بإضافة multer باعتبارها أداة وسيطة عامة ، حيث يمكن للمستخدم الضار تحميل الملفات إلى مسار غير متتوقع. استخدم هذه الدالة فقط على المسارات التي تتعامل فيها مع الملفات التي تم تحميلها. ### `storage` #### `DiskStorage` -The disk storage engine gives you full control on storing files to disk. +يمنحك محرك تخزين القرص التحكم الكامل في تخزين الملفات على القرص. + +
```javascript var storage = multer.diskStorage({ @@ -182,70 +194,62 @@ var storage = multer.diskStorage({ var upload = multer({ storage: storage }) ``` -There are two options available, `destination` and `filename`. They are both -functions that determine where the file should be stored. +
-`destination` is used to determine within which folder the uploaded files should -be stored. This can also be given as a `string` (e.g. `'/tmp/uploads'`). If no -`destination` is given, the operating system's default directory for temporary -files is used. +هناك خياران متاحان ، `destination` و `filename`. كلاهما يعملان على تحديد مكان تخزين الملف. -**Note:** You are responsible for creating the directory when providing -`destination` as a function. When passing a string, multer will make sure that -the directory is created for you. +يتم استخدام `destination` لتحديد أي مجلد يجب تخزين الملفات المحملة. يمكن أيضًا إعطاء هذا كـ`سلسلة` (مثل `'/tmp/uploads'`). إذا لم يتم إعطاء `destination` ، فسيتم استخدام الدليل الافتراضي لنظام التشغيل للملفات المؤقتة. -`filename` is used to determine what the file should be named inside the folder. -If no `filename` is given, each file will be given a random name that doesn't -include any file extension. +**ملاحظة:** أنت مسؤول عن إنشاء الدليل عند توفر `destination` كدالة. عند المرور بسلسلة ، سوف يتأكد multer من إنشاء الدليل من أجلك. -**Note:** Multer will not append any file extension for you, your function -should return a filename complete with an file extension. +يتم استخدام `اسم الملف` لتحديد ما يجب تسمية الملف داخل المجلد. إذا لم يتم تقديم `اسم الملف`، فسيتم إعطاء كل ملف اسمًا عشوائيًا لا يتضمن أي امتداد للملف. -Each function gets passed both the request (`req`) and some information about -the file (`file`) to aid with the decision. +**ملاحظة:** لن يقوم multer بإلحاق اي ملحق ملف لك، الدالة الخاص بك يجب أن تقوم بإرجاع اسم ملف كامل بملحق الملف. -Note that `req.body` might not have been fully populated yet. It depends on the -order that the client transmits fields and files to the server. +يتم تمرير كل دالة من خلال الطلب (req`) وبعض المعلومات حول الملف (`file`) للمساعدة في اتخاذ القرار. + +لاحظ أن `req.body` ربما لم يتم ملؤها بالكامل بعد. يعتمد ذلك على الترتيب الذي يقوم به العميل من خلال نقل المدخلات والملفات إلى الخادم. #### `MemoryStorage` -The memory storage engine stores the files in memory as `Buffer` objects. It -doesn't have any options. +يخزن محرك تخزين الذاكرة الملفات الموجودة في الذاكرة ككائنات `ذاكرة` (`Buffer`). ليس لديها أي خيارات. + +
```javascript var storage = multer.memoryStorage() var upload = multer({ storage: storage }) ``` -When using memory storage, the file info will contain a field called -`buffer` that contains the entire file. +
-**WARNING**: Uploading very large files, or relatively small files in large -numbers very quickly, can cause your application to run out of memory when -memory storage is used. +عند استخدام ذاكرة التخزين ، ستحتوي معلومات الملف على مُدخَل يسمى `buffer` الذي يحتوي على الملف بأكمله. + +**تحذير**: يمكن أن يؤدي تحميل ملفات كبيرة جدًا أو ملفات صغيرة نسبيًا بأعداد كبيرة و بسرعة كبيرة إلى نفاد ذاكرة التطبيق عند استخدام ذاكرة التخزين. ### `limits` -An object specifying the size limits of the following optional properties. Multer passes this object into busboy directly, and the details of the properties can be found on [busboy's page](https://github.com/mscdex/busboy#busboy-methods). +كائن يحدد حدود حجم الخصائص الاختيارية التالية. يقوم Multer بتمرير هذا الكائن إلى busboy مباشرة ، ويمكن العثور على تفاصيل الخصائص من خلال [صفحة busboy's](https://github.com/mscdex/busboy#busboy-methods). -The following integer values are available: +تتوفر القيم الصحيحة التالية: -Key | Description | Default +مفتاح | وصف | افتراضي --- | --- | --- -`fieldNameSize` | Max field name size | 100 bytes -`fieldSize` | Max field value size (in bytes) | 1MB -`fields` | Max number of non-file fields | Infinity -`fileSize` | For multipart forms, the max file size (in bytes) | Infinity -`files` | For multipart forms, the max number of file fields | Infinity -`parts` | For multipart forms, the max number of parts (fields + files) | Infinity -`headerPairs` | For multipart forms, the max number of header key=>value pairs to parse | 2000 +`fieldNameSize` | الحد الأقصى لحجم اسم المُدخَل | 100 بايت +`fieldSize` | الحد الأقصى لحجم قيمة المُدخَل (بالبايت) | 1 ميغابايت +`fields` | الحد الأقصى لعدد المدخلات التى لا تعتبر من الملفات | ما لا نهاية +`fileSize` | حجم الملف الأقصى بالنسبة لإستمارة متعددة الأجزاء (بالبايت) | ما لا نهاية +`files` | الحد الأقصى لعدد المدخلات من نوع الملفات بالنسبة لإستمارة متعددة الأجزاء | ما لا نهاية +`parts` | الحد الأقصى لعدد الأجزاء (مدخلات + ملفات) بالنسبة لإستمارة متعددة الأجزاء | ما لا نهاية +`headerPairs` | الحد الأقصى لعدد أزواج الرأس (المفتاح => القيمة) المطلوب تحليلها بالنسبة لإستمارة متعددة الأجزاء | 2000 -Specifying the limits can help protect your site against denial of service (DoS) attacks. +يمكن أن يساعد تحديد الحدود في حماية موقعك من هجمات حجب الخدمة (DoS). ### `fileFilter` -Set this to a function to control which files should be uploaded and which -should be skipped. The function should look like this: +اضبط هذا على دالة للتحكم في الملفات التي ينبغي تحميلها وأي الملفات يجب تخطيها. يجب أن تبدو دالة كما يلي: + +
```javascript function fileFilter (req, file, cb) { @@ -265,13 +269,16 @@ function fileFilter (req, file, cb) { } ``` -## Error handling +
+ +## معالجة الأخطاء -When encountering an error, Multer will delegate the error to Express. You can -display a nice error page using [the standard express way](http://expressjs.com/guide/error-handling.html). +عند مواجهة خطأ ، سيقوم Multer بتفويض الخطأ إلى Express. يمكنك +عرض صفحة خطأ لطيفة باستخدام [طريقة Express القياسية](http://expressjs.com/guide/error-handling.html). -If you want to catch errors specifically from Multer, you can call the -middleware function by yourself. Also, if you want to catch only [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), you can use the `MulterError` class that is attached to the `multer` object itself (e.g. `err instanceof multer.MulterError`). +إذا كنت تريد إنتقاء الأخطاء والحصول على [أخطاء Multer فقط](https://github.com/expressjs/multer/blob/master/lib/multer-error.js)، فيمكنك نداء بدالة الوسيطة من قبل نفسك. أيضًا ، إذا كنت تريد التقاط أخطاء Multer فقط ، فيمكنك استخدام صنف `MulterError` المتصل بالكائن` multer` نفسه (على سبيل المثال `err instanceof multer.MulterError`). + +
```javascript var multer = require('multer') @@ -290,10 +297,12 @@ app.post('/profile', function (req, res) { }) ``` -## Custom storage engine +
+ +## محرك التخزين الخاص بك -For information on how to build your own storage engine, see [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +للحصول على معلومات حول كيفية إنشاء محرك التخزين الخاص بك ، راجع [محرك تخزين Multer](https://github.com/expressjs/multer/blob/master/StorageEngine.md). -## License +## الترخيص [MIT](LICENSE) From a1b44287e58120ea58c3aceb7c8354f9c3ccfb1b Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:29:15 +0200 Subject: [PATCH 019/103] update README-ko.md : add arabic link .. --- doc/README-ko.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-ko.md b/doc/README-ko.md index 51e29539..fd941ddd 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -7,6 +7,7 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 ## 번역 이 문서는 아래의 언어로도 제공됩니다: +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (아라비아 말) - [English](https://github.com/expressjs/multer/blob/master/README.md) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) From ba25a5c3f8f1f1ef892b991369c44971de99ab8e Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:32:10 +0200 Subject: [PATCH 020/103] update README-ru.md : add arabic link .. --- doc/README-ru.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-ru.md b/doc/README-ru.md index 56bfcc08..4cd41258 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -8,6 +8,7 @@ Multer — это middleware для фреймворка express для обра Это README также доступно на других языках: +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (арабский) - [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) From 4af318a8c57d90f28963b4675ecdaa86a0f5ade1 Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:34:12 +0200 Subject: [PATCH 021/103] update README-zh-cn.md : add arabic link .. --- doc/README-zh-cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 8105c57c..1661f42e 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -10,6 +10,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 ## 其它语言 +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (阿拉伯语) - [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) From 561f42cba7232887dc618ec79cc098ebf21be1cc Mon Sep 17 00:00:00 2001 From: imed jaberi Date: Sat, 17 Aug 2019 03:36:11 +0200 Subject: [PATCH 022/103] update README.md : add arabic link ( to EN ver. ) .. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8b2920d0..02220558 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. This README is also available in other languages: +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Arabic) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) From a47b19f729a6ca005466ab1b1c7ba624a64a0884 Mon Sep 17 00:00:00 2001 From: Gireesh Punathil Date: Tue, 17 Sep 2019 09:25:33 +0530 Subject: [PATCH 023/103] storage: replace deprecated pseudoRandomBytes with randomBytes Fixes: https://github.com/expressjs/multer/issues/509 --- storage/disk.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/disk.js b/storage/disk.js index dfbe8893..2f77c9f1 100644 --- a/storage/disk.js +++ b/storage/disk.js @@ -5,7 +5,7 @@ var crypto = require('crypto') var mkdirp = require('mkdirp') function getFilename (req, file, cb) { - crypto.pseudoRandomBytes(16, function (err, raw) { + crypto.randomBytes(16, function (err, raw) { cb(err, err ? undefined : raw.toString('hex')) }) } From 497c542ecd4cf2c3bfb03a1537d766e1b934dfe2 Mon Sep 17 00:00:00 2001 From: Gireesh Punathil Date: Wed, 18 Sep 2019 11:22:12 +0530 Subject: [PATCH 024/103] doc: clarify the callback calling convention Fixes: https://github.com/expressjs/multer/issues/197 --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8b2920d0..d23e8870 100644 --- a/README.md +++ b/README.md @@ -207,6 +207,10 @@ the file (`file`) to aid with the decision. Note that `req.body` might not have been fully populated yet. It depends on the order that the client transmits fields and files to the server. +For understanding the calling convention used in the callback (needing to pass +null as the first param), refer to +[Node.js error handling](https://www.joyent.com/node-js/production/design/errors) + #### `MemoryStorage` The memory storage engine stores the files in memory as `Buffer` objects. It From ad6de1449de1f79498cca9371bb0e2e41c69be8d Mon Sep 17 00:00:00 2001 From: khacpv Date: Fri, 8 Nov 2019 23:45:22 +0700 Subject: [PATCH 025/103] add vietnamese language README.md --- README.md | 1 + doc/README-vi.md | 290 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 291 insertions(+) create mode 100644 doc/README-vi.md diff --git a/README.md b/README.md index 8b2920d0..e049f54b 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This README is also available in other languages: - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnam) ## Installation diff --git a/doc/README-vi.md b/doc/README-vi.md new file mode 100644 index 00000000..ac045f23 --- /dev/null +++ b/doc/README-vi.md @@ -0,0 +1,290 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer là thư viện trung gian hỗ trợ việc xử lý `multipart/form-data`, mục đích chính cho việc upload file. Thư viện này dựa trên [busboy](https://github.com/mscdex/busboy) để hiệu quả hơn. + +**CHÚ Ý**: Multer sẽ không xử lý bất kỳ form nào ngoài multipart (`multipart/form-data`). + +## Dịch: + +Các bạn có thể đọc ở các bản dịch ngôn ngữ khác: + +- [English](https://github.com/expressjs/multer/blob/master/README.md) (Tiếng Anh) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) + +## Cài đặt + +```sh +$ npm install --save multer +``` + +## Sử dụng + +Multer gắn thêm một object `body` và một object `file` (hoặc `files` trường hợp upload nhiều file) vào object `request`. Object `body` này sẽ chứa các biến text của form, còn object `file` (hoặc `files`) sẽ chứa các file được upload qua form. + +Cách sử sụng: + +Phải thêm `enctype="multipart/form-data"` vào form của bạn. + +```html + + + +``` + +```javascript +var express = require('express'); +var multer = require('multer'); +var upload = multer({ dest: 'uploads/' }); + +var app = express(); + +app.post('/profile', upload.single('avatar'), function(req, res, next) { + // req.file là 1 file `avatar` được upload + // req.body sẽ giữ thông tin gắn kèm (vd: text fields), nếu có +}); + +app.post('/photos/upload', upload.array('photos', 12), function( + req, + res, + next +) { + // req.files là một mảng của các file `photos` + // req.body sẽ giữ thông tin gắn kèm (vd: text fields), nếu có +}); + +var cpUpload = upload.fields([ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 }, +]); +app.post('/cool-profile', cpUpload, function(req, res, next) { + // req.files là một object kiểu (String -> Array) mà fieldname là key, và value là mảng các files + // + // vd: + // req.files['avatar'][0] -> File + // req.files['gallery'] -> Array + // + // req.body sẽ giữ thông tin gắn kèm (vd: text fields), nếu có +}); +``` + +Trong trường hợp bạn cần xử lý một multipart form chỉ chứa text, bạn nên sử dụng hàm `.none()`: + +```javascript +var express = require('express'); +var app = express(); +var multer = require('multer'); +var upload = multer(); + +app.post('/profile', upload.none(), function(req, res, next) { + // req.body sẽ giữ thông tin gắn kèm (vd: text fields) +}); +``` + +## API + +### Thông tin File được upload + +Mỗi file sẽ chứa các thông tin sau: + +| Thuộc tính | Mô tả | Ghi chú | +| -------------- | --------------------------------------------------------------- | ------------------------- | +| `fieldname` | tên mỗi thuộc tính ở trong form | +| `originalname` | Tên của file nằm trên máy của người dùng, trước khi được upload | +| `encoding` | Kiểu Encoding của file | +| `mimetype` | Mime type của file | `image/jpeg`, `image/png` | +| `size` | Kích thước của file (theo bytes) | +| `destination` | Đường dẫn tới thư mục file được lưu | `DiskStorage` | +| `filename` | Tên của file (ở trong `destination`) | `DiskStorage` | +| `path` | Đường dẫn đầy đủ tới file đã upload | `DiskStorage` | +| `buffer` | Một `Buffer` của toàn bộ file | `MemoryStorage` | + +### Tham số `multer(opts)` + +Multer chấp nhận một biến options. Cơ bản là thuộc tính `dest`, là nơi sẽ lưu +file được uplaod. Trong trường hợp bỏ qua options này, file sẽ được giữ trong +RAM và không được lưu trên ổ cứng. + +Mặc định, Multer sẽ đổi tên các file, vì vậy để tránh bị trùng lặp, bạn có thể +tùy biến hàm đổi tên này. + +Dưới đây là các tùy chọn mà bạn có thể sử dụng: + +| Thuộc tính | Mô tả | +| --------------------- | -------------------------------------------------- | +| `dest` hoặc `storage` | Nơi lưu trữ file | +| `fileFilter` | Hàm để xử lý chỉ những file nào mới được chấp nhận | +| `limits` | Giới hạn dung lượng file được upload | +| `preservePath` | Giữ đầy đủ đường dẫn tới file thay vì chỉ tên file | + +Nói chung với web app, chỉ `dest` mới cần khai báo, như bên dưới: + +```javascript +var upload = multer({ dest: 'uploads/' }); +``` + +Nếu bạn muốn tùy biến việc upload, bạn sẽ muốn dùng tùy chọn `storage` thay vì `dest`. +Multer sẽ sử dụng 1 trong 2 cách `DiskStorage` và `MemoryStorage`; Hoặc các cách khác (với các thư viện ngoài). + +#### `.single(fieldname)` + +Chấp nhận chỉ một file với tên thuộc tính `fieldname`. File này truy cập qua `req.file`. + +#### `.array(fieldname[, maxCount])` + +Chấp nhận mảng các file, tất cả đều với tên `fieldname`. Một lỗi sẽ bắn ra nếu có +nhiều hơn `maxCount` file được upload. Các file này được lưu ở `req.files`. + +#### `.fields(fields)` + +Chấp nhận nhiều file với thuộc tính `fields`. Một object với mảng các file được lưu ở `req.files`. + +`fields` là một mảng các object với thuộc tính `name` và có thể có thuộc tính `maxCount` hoặc không. + +Ví dụ: + +```javascript +[{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]; +``` + +#### `.none()` + +Chỉ chấp nhận các giá trị text trong form. Nếu bất kỳ file được đính +kèm, một lỗi với mã "LIMIT_UNEXPECTED_FILE" sẽ bắn ra. + +#### `.any()` + +Chấp nhận tất cả file đến từ bất kỳ nguồn nào. Một mảng các file sẽ được lưu +ở `req.files`. + +**CHÚ Ý:** Hãy chắc chắn bạn không bỏ qua bất kỳ file nào mà người dùng upload. +Đừng bao giờ khai báo Multer như một middleware toàn cục, vì người dùng có thể upload +các file tới một api nào đó mà bạn không biết. Chỉ sử dụng hàm này ở trên api mà bạn +muốn xử lý việc upload file. + +### `storage` + +#### `DiskStorage` + +Cơ chế lưu trữ trên ổ đĩa cho phép bạn có đầy đủ quyền để thao tác với file. + +```javascript +var storage = multer.diskStorage({ + destination: function(req, file, cb) { + cb(null, '/tmp/my-uploads'); + }, + filename: function(req, file, cb) { + cb(null, file.fieldname + '-' + Date.now()); + }, +}); + +var upload = multer({ storage: storage }); +``` + +Có 2 tùy chọn, `destination` và `filename`. Chúng đều dùng để xác định nơi nào +file sẽ được lưu trữ. + +`destination` được dùng để xác định thư mục nào file được upload. Có thể là một +`string` (vd: `'/tmp/uploads'`). Nếu không khai báo `destination`, thư mục tạm +(của hệ điều hành) sẽ được dùng để chứa các file đó. + +**Ghi chú:** Nếu bạn khai báo `destination` là một hàm, bạn phải tự tạo đường +dẫn. Còn nếu truyền vào một string, multer sẽ đảm bảo việc tạo đường dẫn đó cho bạn. + +`filename` được dùng để xác định file nào sẽ được lưu trong thư mục. Nếu không +có `filename` nào, mỗi file sẽ nhận tên ngẫu nhiên mà không bao gồm đuôi của file. + +**Ghi chú:** Multer sẽ không thêm bất kỳ đuôi file nào cho bạn, hàm của bạn nên +trả về một file với đuôi của nó. + +Mỗi hàm được truyền cả ở request (`req`) và thông tin về file (`file`) để xử lý. + +Chú ý `req.body` có thể không chứa đầy đủ thông tin, phụ thuộc việc thứ tự các +trường dữ liệu và file được gửi tới server lúc nào. + +#### `MemoryStorage` + +Memory storage lưu các file ở bộ nhớ máy dưới dạng một object `Buffer`. Nó không +có bất kỳ tùy chọn nào. + +```javascript +var storage = multer.memoryStorage(); +var upload = multer({ storage: storage }); +``` + +Khi sử dụng memory storage, thông tin file sẽ chứa một trường `buffer`, trường +này chứa toàn bộ file. + +**CHÚ Ý**: Việc upload file rất lớn, hoặc tương tự việc nhiều file nhỏ, có thể +gây ra tràn bộ nhớ khi memory storage được sử dụng. + +### `limits` + +Một object mô tả giới hạn kích thước trong thuộc tính nên được sử dụng. Multer truyền object này trực tiếp vào busboy, và chi tiết của busboy có thể xem thêm ở [busboy's page](https://github.com/mscdex/busboy#busboy-methods). + +Các số dưới dây cũng có thể được dùng: + +| Thuộc tính | Mô tả | Giá trị mặc định | +| --------------- | -------------------------------------------------------------------- | ---------------- | +| `fieldNameSize` | Độ dài tối đa của tên field | 100 bytes | +| `fieldSize` | Kích thước tối đa của mỗi field (theo bytes) | 1MB | +| `fields` | Số lượng tối đa của các fields không phải là file | Infinity | +| `fileSize` | Cho multipart forms, kích thước tối đa của file (theo bytes) | Infinity | +| `files` | Cho multipart forms, số lượng file tối đa | Infinity | +| `parts` | Cho multipart forms, số lượng tối đa của parts (gồm fields + files) | Infinity | +| `headerPairs` | Cho multipart forms, số tối đa trong header cặp key=>value để truyền | 2000 | + +Khai báo các giới hạn này giúp cho site của bạn chống lại các tấn công nguy hiểm (DoS). + +### `fileFilter` + +Dùng hàm này để xử lý các file nào cho phép và bị bỏ qua. Xem ví dụ dưới dây: + +```javascript +function fileFilter(req, file, cb) { + // hàm này sẽ gọi callback `cb` với 1 biến boolean + // để chỉ ra rằng file có được chấp nhận hay không + + // Để chặn file này, truyền `false` như sau: + cb(null, false); + + // Để chấp nhận file này, truỳen `true`, như sau: + cb(null, true); + + // Hoặc bạn có thể truyền vào 1 lỗi nếu có vấn đề xảy ra: + cb(new Error("I don't have a clue!")); +} +``` + +## Error handling + +Khi một lỗi xảy ra, Multer sẽ gửi lỗi đó cho Express. Bạn có thể hiển thị +đẹp hơn sử dụng [cách bắt lỗi chuẩn của Express](http://expressjs.com/guide/error-handling.html). + +Nếu bạn muốn bắt các lỗi cụ thể từ Multer, bạn có thể tự gọi hàm trung gian (middleware) này. Ngoài ra, nếu bạn chỉ muốn bắt [lỗi của Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), bạn có thể dùng class `MulterError` được đính kèm với chính object `multer` (vd: `err instanceof multer.MulterError`). + +```javascript +var multer = require('multer'); +var upload = multer().single('avatar'); + +app.post('/profile', function(req, res) { + upload(req, res, function(err) { + if (err instanceof multer.MulterError) { + // Một lỗi của Multer xảy ra khi upload. + } else if (err) { + // Một lỗi không xác định xảy ra khi upload. + } + + // Mọi thứ khác chạy ok. + }); +}); +``` + +## Tùy chọn storage engine + +Để làm sao tự xây dựng cơ chế lưu file riêng của mình, hãy xem [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## License + +[MIT](LICENSE) From ba02a28281c6f8e7224f3bc0c5e2b941596e8cd2 Mon Sep 17 00:00:00 2001 From: Tanya Sandoval <13929456+tsando@users.noreply.github.com> Date: Sun, 26 Jan 2020 18:07:28 +0000 Subject: [PATCH 026/103] Update README.md Co-Authored-By: Jonathan Church --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f432761a..d4b9e51d 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ app.post('/profile', upload.array(), function (req, res, next) { }) ``` -Here's an example on how this links to an HTML form. Suppose we have a form group with enctype="multipart/form-data" as follows: +Here's an example on how multer is used an HTML form. Take special note of the `enctype="multipart/form-data"` and `name="uploaded_file"` fields: ```html
From b818a49134a53a810c8b38327dc8d5737e1a7dcd Mon Sep 17 00:00:00 2001 From: Tanya Sandoval <13929456+tsando@users.noreply.github.com> Date: Sun, 26 Jan 2020 18:07:37 +0000 Subject: [PATCH 027/103] Update README.md Co-Authored-By: Jonathan Church --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4b9e51d..16d50b3d 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Here's an example on how multer is used an HTML form. Take special note of the ` ``` -Then in your javascript file you would add these lines to access both the file and the body: +Then in your javascript file you would add these lines to access both the file and the body. It is important that you use the `name` field value from the form in your upload function. This tells multer which field on the request it should look for the files in. If these fields aren't the same in the HTML form and on your server, your upload will fail: ```javascript var multer = require('multer') From 8bbd63128cb58f7a65f7d66eeb692fb5dcd5aee0 Mon Sep 17 00:00:00 2001 From: Lautaro Jayat Date: Fri, 14 Feb 2020 20:43:27 -0300 Subject: [PATCH 028/103] Added spanish translation of README.md + Added file as /doc/README-es.md --- doc/README-es.md | 267 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 doc/README-es.md diff --git a/doc/README-es.md b/doc/README-es.md new file mode 100644 index 00000000..f053cced --- /dev/null +++ b/doc/README-es.md @@ -0,0 +1,267 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer es un "*middleware*"" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. + +**NOTA**: Multer no procesará ningún formulario basado en `multipart/form-data`. + +## Traducciones + +Éste archivo README también está disponible en otros lenguajes: + +- [Engilsh] (https://github.com/expressjs/multer/blob/master/README.md) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) + +## Instralación + +```sh +$ npm install --save multer +``` + +## Uso + +Multer añade un objeto `body` y un objeto `file` o `files` al objeto `request`. El objeto `body` coniene los valores correspondientes a los campos de texto del formulario, los objetos `file` o `files` contienen los archivos que serán subidos mediante el formulario. + +Ejemplo básico de cómo usarlo: + +No te olvides de `enctype="multipart/form-data"` en tu formulario. + +```html +
+ +
+``` + +```javascript +var express = require('express') +var multer = require('multer') +var upload = multer({ dest: 'uploads/' }) + +var app = express() + +app.post('/profile', upload.single('avatar'), function (req, res, next) { + // req.file es el `avatar` del archivo + // req.body tendrá los campos textuales, en caso de haber alguno. +}) + +app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { + // req.files es el arreglo (array) de archivos `photos` + // req.body tendrá los campos textuales, en caso de haber alguno. +}) + +var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', cpUpload, function (req, res, next) { + // req.files es un objeto (String -> Array) donde el nombre del campo es la clave (key) y el valor es el arreglo (arrya) de archivos + // + // Ejemplo + // req.files['avatar'][0] -> Archivo + // req.files['gallery'] -> Array + // + // req.body tendrá los campos textuales, en caso de haber alguno. +}) +``` + +En caso de que necesites manejar un formulario multiparte (multipart form) que sólo contiene campos de texto, recomendamos usar el método `.none()`: + +```javascript +var express = require('express') +var app = express() +var multer = require('multer') +var upload = multer() + +app.post('/profile', upload.none(), function (req, res, next) { + // req.body contiene los campos textuales +}) +``` + +## API + +### Información del archivo + +Cada archivo contiene la siguiente información: + +Clave (Key) | Descripción | Nota +--- | --- | --- +`fieldname` | Es el nombre del campo especificado en el formulario | +`originalname` | Nombre del archivo en la computadora del usuario | +`encoding` | Tipo de codificación del archivo | +`mimetype` | Mime type del archivo | +`size` | Tamaño del archivo en Bytes | +`destination` | La carpeta en donde el archivo ha sido guardado | `DiskStorage` +`filename` | El nombre del archivo en `destination` | `DiskStorage` +`path` | El camino completo donde se ha subido el archivo (full path) | `DiskStorage` +`buffer` | Un `Buffer` con el archivo completo | `MemoryStorage` + +### `multer(opts)` + +Muler acepta un objeto para configurar sus opciones, la más básica de ellas es la propiedad `dest`, la cual informa a Multer dónde debe subir los archivos. En caso de que omitas el objeto con las opciones, los archivos serán guardados en la memoria y nunca serán escritos en el disco. + +Por defecto, Multer renombrará los archivos para evitar conflictos de nombres. La función usada para renombrarlos puede ser modificada acorde a tus necesidades. + +Las siguientes son las opciones que pueden ser utilizadas con Multer. + +Clave (key) | Descripción +--- | --- +`dest` o `storage` | Donde se guardarán los archivos +`fileFilter` | Función para controlar qué archivos son aceptados +`limits` | Limites de los datos de subida +`preservePath` | Mantiene la dirección completa de la ubicación de los archivos, en vez de sólo sus nombres + +En la aplicación web promedio es probable que sólo se requiera `dest`, siendo configurado como en el siguiente ejemplo: + +```javascript +var upload = multer({ dest: 'uploads/' }) +``` + +Si quieres más control sobre tus subidas, tendrás que usar la opción `storage` en vez de `dest`. Multer incorpora los mecanismos de almacenamiento `DiskStorage` y `MemoryStorage`; existen otros medios provistos por terceros. + +#### `.single(fieldname)` + +Acepta un único archivo con el nombre `fieldname`. Dicho archivo será guardado en `req.file`. + +#### `.array(fieldname[, maxCount])` + +Acepta un arreglo (array), de archivos, todos con el nombre `fieldname`. Opcionalmente puede generarse un error si se intentan subir una cantidad de archivos superior a `maxCount`. El arreglo (array) de archivos será guardado en `req.files`. + +#### `.fields(fields)` + +Acepta una mixtura de archivos, especificados por `field`. Un objeto con arreglos (arrays) de archivos será guardado en `req.files` + +`fields` debiera ser un arreglo (array) de objetos con `name` y opcionalmente `maxCount`. +Example: + +```javascript +[ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 } +] +``` + +#### `.none()` + +Acepta sólo campos de texto. En caso de intentar subir un archivo, se generará un error con el siguiente código +"LIMIT\_UNEXPECTED\_FILE". + +#### `.any()` + +Acepta todos los archivos que han sido enviado. Un arreglo (array) contieniendo los archivos será guardado en `req.files`. + +**ADVERTENCIA:** Asegurate siempre manejar los archivos que los usuarios intenten subir. Nunca uses Multer como una función middleware de manera global dado que, de esta forma, un usuario malicioso podría subir archivos por medio de rutas que no has anticipado. Usa sólo esta función en rutas en las que estás esperando archivos. + +### `storage` + +#### `DiskStorage` + +El mecanismo de almacenamiento en el disco otorga completo control en la escritura de archivos en tu disco. + +```javascript +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + cb(null, file.fieldname + '-' + Date.now()) + } +}) + +var upload = multer({ storage: storage }) +``` + +Hay dos opciones disponibles, `destination` y `filename`. Ambas son funciones que determinan dónde debería almacenarse el archivo. + +`destination` es usado para determinar la capeta en donde los archivos subidos deberían ser almacenados. Esto también puede ser informado mediante una `string` (por ejemplo: `'/tmp/uploads'`). Si ninguna propiedad `destination` es dada, entonces será usado el directorio por defecto en donde el sistema operativo almacena sus archivos temporales. + +**Nota:** Al pasar `destination` como una función, tú eres el responsable de crear los directorios donde los archivos serán almacenado. Cuando una `string` es dada a `destination`, Multer se asegurará que el directorio sea creado en caso de no encontrar uno. + +`filename` es usado para determinar cómo debería ser nombrado el archivo dentro de la carpeta. Si `filename` no es provisto, a cada archivo se le asignará un nombre aleatorio que no incluirá ninguna extensión. + +**Nota:** Multer no añadirá ningúna extensión de archivos por tí, es tu función la que debería retornar un nombre completo, incluyendo también la extensión del archivo. + +El objeto request (`req`) y parte de la información del archivo (`file`) son pasadas a tu función para ayudar con la con la decisión en la nomenclatura. + +Nota que `req.body` puede que no haya sido totalmente poblado todavía. Esto depende del orden en el que el cliente transmita sus campos y archivos hacia el servidor. + +#### `MemoryStorage` + +El mecanismo de almacenamiento en memoria almacena los archivos en la memoria en la forma de objetos `Buffer`. Para esto no se proveen opciones. + +```javascript +var storage = multer.memoryStorage() +var upload = multer({ storage: storage }) +``` + +Al usar el almacenamiento en memoria, la información del archivo contendrá un campo llamado `buffer` que contiene el archivo entero. + +**ADVERTENCIA**: Subir archivos grandes, o relativamente pequeños pero en gran cantidad y muy rápido, puede provocar que tu aplicación se quede sin memoria cuando es usado el almacenamiento en memoria. + +### `limits` + +Un objeto que especifica los límites correpondientes a los tamaños de las siguientes propiedades. Multer pasa este objeto directamente a *busboy*, los detalles de las propiedades pueden encontrarse en [la página de busboy](https://github.com/mscdex/busboy#busboy-methods). + +Los siguientes valores en números enteros están disponibles: + +Clave (Key) | Descripción | Por defecto +--- | --- | --- +`fieldNameSize` | Tamaño máximo del nombre del campo | 100 bytes +`fieldSize` | Tamaño máximo de los valores para cada campo (en bytes) | 1MB +`fields` | Número máximo de la cantidad de campos | Infinito +`fileSize` | Para formularios multiparte, el tamaño máximo de los archivos (en bytes) | Infinito +`files` | Para los formularios multiparte, el número máximo de campos para archivos | Infinito +`parts` | Para los formularios multiparte, el número máximo de partes (campos + archivos) | Infinito +`headerPairs` | Para los formularios multiparte, el número máximo de cabeceras de pares clave(key)=> valor para analizar | 2000 + +Especificar los límites puede ayudarte a protejer tu sitio contra ataques de privación del servicio (DoS). + +### `fileFilter` + +Asigna ésto a una función que controle cuáles archivos deben ser subidos y cuáles deben ser omitidos. La función debería verse como ésta: + +```javascript +function fileFilter (req, file, cb) { + + // La función debe llamar a `cb` usando una variable del tipo boolean + // para indicar si el archivo debería ser aceptado o no + + // Para rechazar el archivo es necesario pasar `false`, de la siguiente forma: + cb(null, false) + + // Para aceptar el archivo es necesario pasar `true`, de la siguiente forma: + cb(null, true) + + // Siempre puedes pasar un error en caso de que algo salga mal: + cb(new Error('No tengo la menor idea!')) + +} +``` + +## Manejo de errores + +Al encontrarse con un error, Multer delegará ese error a Express. Puedes mostrar una linda página de error usando [la manera standard de Express](http://expressjs.com/guide/error-handling.html). + +Si quieres atajar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres atajar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). + +```javascript +var multer = require('multer') +var upload = multer().single('avatar') + +app.post('/profile', function (req, res) { + upload(req, res, function (err) { + if (err instanceof multer.MulterError) { + // Un error de Multer ocurrió durante la subida. + } else if (err) { + // Un error desconocido ocurrió durante la subida. + } + + // Todo salió bien. + }) +}) +``` + +## Mecanismos de almacenamiento personalizados + +Para más información acerca de cómo construir tu propio mecanismo de almacenamiento, recomendamos leer [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## Licencia + +[MIT](LICENSE) From 92d83c158d2eca0c9702bf24cdff6d6422ab6ad7 Mon Sep 17 00:00:00 2001 From: Joe Becher Date: Tue, 18 Feb 2020 08:29:09 -0500 Subject: [PATCH 029/103] Add Math.random() to storage filename example (#841) * Add Math.random() to storage filename example I was encountering an issue where two files had the same name due to being handled in the same millisecond. While not a bug, adding extra uniqueness may save someone else time troubleshooting 'missing' files. * Remove the period from the hash * Convert to string and split. Also rename * Update README.md * Math.round(Math.random() * 1E9) and revert dashes --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b2920d0..54f44aa7 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,8 @@ var storage = multer.diskStorage({ cb(null, '/tmp/my-uploads') }, filename: function (req, file, cb) { - cb(null, file.fieldname + '-' + Date.now()) + const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) + cb(null, file.fieldname + '-' + uniqueSuffix) } }) From d4df2788763978214fa70a0f83eadeb8044f92ea Mon Sep 17 00:00:00 2001 From: Jon Church Date: Thu, 26 Mar 2020 13:39:45 -0400 Subject: [PATCH 030/103] bump mkdirp version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 21dc96a9..1eb03680 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "append-field": "^1.0.0", "busboy": "^0.2.11", "concat-stream": "^1.5.2", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "on-finished": "^2.3.0", "type-is": "^1.6.4", From d0446f7d94261b962ed0d7a2a101f28317629117 Mon Sep 17 00:00:00 2001 From: Rudenko Artem Date: Fri, 10 Apr 2020 02:34:03 +0300 Subject: [PATCH 031/103] fixed few mistake in russian doc --- doc/README-ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index 56bfcc08..33328453 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -213,7 +213,7 @@ var upload = multer({ storage: storage }) ### `fileFilter` -Задает функцию для того, чтобы решать, какие файлы должны быть загружены, а какие — нет. Функция может выглядет так: +Задают функцию для того, чтобы решать, какие файлы будут загружены, а какие — нет. Функция может выглядеть так: ```javascript function fileFilter (req, file, cb) { From 604f60b89cd2413a4064aaa24e106d38c55857b0 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Thu, 23 Apr 2020 21:01:52 -0300 Subject: [PATCH 032/103] Corrections in translation --- doc/README-pt-br.md | 55 +++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index 77016ddc..f0d89e13 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -95,7 +95,7 @@ Key | Descrição | Nota ### `multer(opts)` -Multer aceita um objeto de opções, a propriedade mais básico dos é o`dest`, que diz ao Multer onde fazer o upload dos arquivos. No caso de você omitir o objeto de opções, os arquivos serão mantidos na memória e nunca gravados no disco. +Multer aceita um objeto de opções, a propriedade mais básica é o `dest`, que diz ao Multer onde fazer o upload dos arquivos. No caso de você omitir o objeto de opções, os arquivos serão mantidos na memória e nunca gravados no disco. Por padrão, Multer irá renomear os arquivos para evitar conflitos de nomes. A função de renomeação pode ser personalizada de acordo com suas necessidades. @@ -108,33 +108,29 @@ Key | Descrição `limits` | Limites dos dados enviados `preservePath` | Mantenha o caminho completo dos arquivos em vez de apenas o nome base -Em um web app basico, somente `dest` pode ser necessário, e configurado como mostrado em -o exemplo a seguir. +Em um web app básico, somente o `dest` pode ser necessário, e configurado como mostrado no exemplo a seguir: ```javascript var upload = multer({ dest: 'uploads/' }) ``` -Se você quiser mais controle sobre seus envios, você vai querer usar a opção `storage` -em vez de `dest`. Multer vem com motores de armazenamento `DiskStorage` -e `MemoryStorage`; Mais mecanismos estão disponíveis de terceiros. +Se você quiser mais controle sobre seus envios, você ter que usar a opção `storage` em vez de `dest`. Multer vem com motores de armazenamento `DiskStorage` e `MemoryStorage`; Mais mecanismos estão disponíveis de terceiros. #### `.single(fieldname)` -Aceite um único arquivo com o nome `fieldname`. O arquivo único será armazenado -em `req.file`. +Aceite um único arquivo com o nome `fieldname`. O arquivo único será armazenado em `req.file`. #### `.array(fieldname[, maxCount])` -Aceite múltiplos arquivos, todos com o nome `fieldname`. Opcionalmente, erro se mais de `maxCount` forem enviados. O array de arquivos serão armazenados em +Aceite múltiplos arquivos, todos com o nome `fieldname`. Opcional, gera um erro se mais de `maxCount` forem enviados. O array de arquivos serão armazenados em `req.files`. #### `.fields(fields)` -Aceite uma mistura de arquivos, especificada por `fields`. Um objeto com array de arquivos -será armazenado em `req.files`. +Aceita uma mistura de arquivos, especificada por `fields`. Um objeto com um array de arquivos será armazenado em `req.files`. + +`fields` deve ser uma matriz de objetos com `name` e opcionalmente com `maxCount`. -`fields` deve ser uma matriz de objetos com `name` e opcionalmente um `maxCount`. Exemplo: ```javascript @@ -146,17 +142,15 @@ Exemplo: #### `.none()` -Aceite apenas campos de texto. Se algum upload de arquivo for feito, erro com código -"LIMIT\_UNEXPECTED\_FILE" será emitido. +Aceite apenas campo de texto. Se algum upload de arquivo for feito, um erro com código "LIMIT\_UNEXPECTED\_FILE" será emitido. #### `.any()` -AAceita todos os arquivos que são enviaos. Uma matriz de arquivos será armazenada em +Aceita todos os arquivos que são enviaos. Uma matriz de arquivos será armazenada em `req.files`. **AVISO:** Certifique-se de sempre manipular os arquivos que um usuário envia. -Nunca adicione multer como global middleware já que um usuário mal-intencionado poderia fazer upload de arquivos para uma rota que você não previu. Use esta função apenas nas rotas -onde você está lidando com os arquivos enviados. +Nunca adicione o Multer como global no middleware, já que um usuário mal-intencionado poderia fazer upload de arquivos para uma rota que você não previu. Use esta função apenas nas rotas onde você está lidando com os arquivos enviados. ### `storage` @@ -181,33 +175,31 @@ Existem duas opções disponíveis, `destination` e `filename`. Ambas são funç `destination` é usado para determinar em qual pasta os arquivos enviados devem ser armazenados. Isso também pode ser dado como uma `string` (e.g. `'/tmp/uploads'`). Se não é dada `destination`, o diretório padrão do sistema operacional para arquivos temporários é usado. -**Nota:** Você é responsável por criar o diretório ao fornecer "destino" como uma função. Ao passar uma string, o multer se certificará de que o diretório foi criado para você. +**Nota:** Você é responsável por criar o diretório ao fornecer o "destino" com uma função. Ao passar uma string, o Multer se certificará de que o diretório foi criado para você. -`filename` ié usado para determinar qual arquivo deve ser nomeado dentro da pasta. -Se não é dada `filename`, Cada arquivo receberá um nome aleatório que não inclui nenhuma extensão de arquivo. +`filename` é usado para determinar qual arquivo deve ser nomeado dentro da pasta. +Se não for passado `filename`, cada arquivo receberá um nome aleatório que não inclui nenhuma extensão de arquivo. -**Nota:** Multer não adicionará nenhuma extensão de arquivo para você, sua função deve retornar um nome de arquivo completo com uma extensão de arquivo. +**Nota:** Multer não adicionará nenhuma extensão de arquivo para você, sua função é retornar um nome para o arquivo completo com a extensão de arquivo. Cada função é passada pelo request (`req`) e algumas informações sobre o arquivo (`file`) para ajudar com a decisão. -Observe que `req.body` pode não ter sido totalmente preenchido ainda. Depende do -ordenar que o cliente transmita campos e arquivos para o servidor. +Observe que `req.body` pode não ter sido totalmente preenchido ainda. Isso depende da ordem na qual o cliente transmite campos e arquivos para o servidor. #### `MemoryStorage` -O mecanismo de armazenamento de memória armazena os arquivos na memória como um objeto `Buffer`. Não tem opções. +O mecanismo de armazenamento na memória, armazena os arquivos na memória como um objeto `Buffer`. Não tendo opções. ```javascript var storage = multer.memoryStorage() var upload = multer({ storage: storage }) ``` -Ao usar o armazenamento de memória, as informações do arquivo conterão um campo chamado -`buffer` que contém o arquivo inteiro. +Ao usar o armazenamento de memória, as informações do arquivo conterão um campo chamado `buffer` que contém o arquivo inteiro. **AVISO**: Fazer upload de arquivos muito grandes ou arquivos relativamente pequenos em grande número muito rapidamente pode fazer com que o aplicativo fique sem memória quando o armazenamento de memória é usado. ### `limits` -Um objeto que especifica os limites de tamanho das seguintes propriedades opcionais. Multer passa esse objeto diretamente para o busboy, e os detalhes das propriedades podem ser encontrados em [busboy's page](https://github.com/mscdex/busboy#busboy-methods). +Um objeto que especifica os limites de tamanho das seguintes propriedades opcionais. O Multer passa diretamente o objeto para o busboy, e os detalhes das propriedades podem ser encontrados em [busboy's page](https://github.com/mscdex/busboy#busboy-methods). Os seguintes valores inteiros estão disponíveis: @@ -226,6 +218,7 @@ A especificação dos limites pode ajudar a proteger seu site contra ataques de ### `fileFilter` Defina isso para uma função para controlar quais arquivos devem ser enviados e quais devem ser ignorados. + A função deve ficar assim: ```javascript @@ -248,11 +241,9 @@ function fileFilter (req, file, cb) { ## Error handling -Quando encontrar um erro, Multer delegará o erro para Express. Você pode -exibir uma boa página de erro usando [the standard express way](http://expressjs.com/guide/error-handling.html). +Quando encontrar um erro, Multer delegará o erro para Express. Você pode exibir uma boa página de erro usando [the standard express way](http://expressjs.com/guide/error-handling.html). -Se você quer pegar erros especificamente do Multer, você pode enviar para o -função de middleware . Além disso, se você quiser pegar apenas [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), você pode usar o `MulterError` classe que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). +Se você quer pegar erros especificamente do Multer, você pode enviar para o função de middleware. Além disso, se você quiser pegar apenas [os erros do Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), você pode usar a classe `MulterError` que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). ```javascript var multer = require('multer') @@ -275,6 +266,6 @@ app.post('/profile', function (req, res) { Para obter informações sobre como criar seu próprio mecanismo de armazenamento, veja [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). -## License +## Licença [MIT](LICENSE) From ca0bb8135f57b082e5558946f31dcede8cfe5947 Mon Sep 17 00:00:00 2001 From: Douglas Christopher Wilson Date: Thu, 23 Apr 2020 21:36:43 -0400 Subject: [PATCH 033/103] package: bump standard --- lib/make-middleware.js | 4 +- lib/multer-error.js | 14 ++--- package.json | 3 +- test/disk-storage.js | 101 +++++++++++++++++----------------- test/error-handling.js | 46 ++++++++-------- test/expected-files.js | 28 +++++----- test/express-integration.js | 20 +++---- test/fields.js | 35 ++++++------ test/file-filter.js | 12 ++--- test/file-ordering.js | 6 +-- test/functionality.js | 14 ++--- test/issue-232.js | 4 +- test/memory-storage.js | 105 ++++++++++++++++++------------------ test/none.js | 14 ++--- test/reuse-middleware.js | 14 ++--- test/select-field.js | 24 ++++----- test/unicode.js | 10 ++-- 17 files changed, 229 insertions(+), 225 deletions(-) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index 2a8a522f..d22042ee 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -85,7 +85,7 @@ function makeMiddleware (setup) { if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname) // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6) - if (limits && limits.hasOwnProperty('fieldNameSize')) { + if (limits && Object.prototype.hasOwnProperty.call(limits, 'fieldNameSize')) { if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY') } @@ -98,7 +98,7 @@ function makeMiddleware (setup) { if (!filename) return fileStream.resume() // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6) - if (limits && limits.hasOwnProperty('fieldNameSize')) { + if (limits && Object.prototype.hasOwnProperty.call(limits, 'fieldNameSize')) { if (fieldname.length > limits.fieldNameSize) return abortWithCode('LIMIT_FIELD_KEY') } diff --git a/lib/multer-error.js b/lib/multer-error.js index f67c637a..4c91d295 100644 --- a/lib/multer-error.js +++ b/lib/multer-error.js @@ -1,13 +1,13 @@ var util = require('util') var errorMessages = { - 'LIMIT_PART_COUNT': 'Too many parts', - 'LIMIT_FILE_SIZE': 'File too large', - 'LIMIT_FILE_COUNT': 'Too many files', - 'LIMIT_FIELD_KEY': 'Field name too long', - 'LIMIT_FIELD_VALUE': 'Field value too long', - 'LIMIT_FIELD_COUNT': 'Too many fields', - 'LIMIT_UNEXPECTED_FILE': 'Unexpected field' + LIMIT_PART_COUNT: 'Too many parts', + LIMIT_FILE_SIZE: 'File too large', + LIMIT_FILE_COUNT: 'Too many files', + LIMIT_FIELD_KEY: 'Field name too long', + LIMIT_FIELD_VALUE: 'Field value too long', + LIMIT_FIELD_COUNT: 'Too many fields', + LIMIT_UNEXPECTED_FILE: 'Unexpected field' } function MulterError (code, field) { diff --git a/package.json b/package.json index 21dc96a9..dc51ac8d 100644 --- a/package.json +++ b/package.json @@ -29,12 +29,13 @@ "xtend": "^4.0.0" }, "devDependencies": { + "deep-equal": "^2.0.3", "express": "^4.13.1", "form-data": "^1.0.0-rc1", "fs-temp": "^1.1.2", "mocha": "^3.5.3", "rimraf": "^2.4.1", - "standard": "^11.0.1", + "standard": "^14.3.3", "testdata-w3c-json-form": "^1.0.0" }, "engines": { diff --git a/test/disk-storage.js b/test/disk-storage.js index 7e25a82a..bc923ab5 100644 --- a/test/disk-storage.js +++ b/test/disk-storage.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ var assert = require('assert') +var deepEqual = require('deep-equal') var fs = require('fs') var path = require('path') @@ -37,12 +38,12 @@ describe('Disk Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.body.name, 'Multer') + assert.strictEqual(req.body.name, 'Multer') - assert.equal(req.file.fieldname, 'small0') - assert.equal(req.file.originalname, 'small0.dat') - assert.equal(req.file.size, 1778) - assert.equal(util.fileSize(req.file.path), 1778) + assert.strictEqual(req.file.fieldname, 'small0') + assert.strictEqual(req.file.originalname, 'small0.dat') + assert.strictEqual(req.file.size, 1778) + assert.strictEqual(util.fileSize(req.file.path), 1778) done() }) @@ -66,18 +67,18 @@ describe('Disk Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.body.name, 'Multer') - assert.equal(req.body.version, '') - assert.equal(req.body.year, '') + assert.strictEqual(req.body.name, 'Multer') + assert.strictEqual(req.body.version, '') + assert.strictEqual(req.body.year, '') - assert.deepEqual(req.body.checkboxfull, [ 'cb1', 'cb2' ]) - assert.deepEqual(req.body.checkboxhalfempty, [ 'cb1', '' ]) - assert.deepEqual(req.body.checkboxempty, [ '', '' ]) + assert(deepEqual(req.body.checkboxfull, ['cb1', 'cb2'])) + assert(deepEqual(req.body.checkboxhalfempty, ['cb1', ''])) + assert(deepEqual(req.body.checkboxempty, ['', ''])) - assert.equal(req.file.fieldname, 'empty') - assert.equal(req.file.originalname, 'empty.dat') - assert.equal(req.file.size, 0) - assert.equal(util.fileSize(req.file.path), 0) + assert.strictEqual(req.file.fieldname, 'empty') + assert.strictEqual(req.file.originalname, 'empty.dat') + assert.strictEqual(req.file.size, 0) + assert.strictEqual(util.fileSize(req.file.path), 0) done() }) @@ -106,42 +107,42 @@ describe('Disk Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, {}) + assert(deepEqual(req.body, {})) - assert.equal(req.files['empty'][0].fieldname, 'empty') - assert.equal(req.files['empty'][0].originalname, 'empty.dat') - assert.equal(req.files['empty'][0].size, 0) - assert.equal(util.fileSize(req.files['empty'][0].path), 0) + assert.strictEqual(req.files.empty[0].fieldname, 'empty') + assert.strictEqual(req.files.empty[0].originalname, 'empty.dat') + assert.strictEqual(req.files.empty[0].size, 0) + assert.strictEqual(util.fileSize(req.files.empty[0].path), 0) - assert.equal(req.files['tiny0'][0].fieldname, 'tiny0') - assert.equal(req.files['tiny0'][0].originalname, 'tiny0.dat') - assert.equal(req.files['tiny0'][0].size, 122) - assert.equal(util.fileSize(req.files['tiny0'][0].path), 122) + assert.strictEqual(req.files.tiny0[0].fieldname, 'tiny0') + assert.strictEqual(req.files.tiny0[0].originalname, 'tiny0.dat') + assert.strictEqual(req.files.tiny0[0].size, 122) + assert.strictEqual(util.fileSize(req.files.tiny0[0].path), 122) - assert.equal(req.files['tiny1'][0].fieldname, 'tiny1') - assert.equal(req.files['tiny1'][0].originalname, 'tiny1.dat') - assert.equal(req.files['tiny1'][0].size, 7) - assert.equal(util.fileSize(req.files['tiny1'][0].path), 7) + assert.strictEqual(req.files.tiny1[0].fieldname, 'tiny1') + assert.strictEqual(req.files.tiny1[0].originalname, 'tiny1.dat') + assert.strictEqual(req.files.tiny1[0].size, 7) + assert.strictEqual(util.fileSize(req.files.tiny1[0].path), 7) - assert.equal(req.files['small0'][0].fieldname, 'small0') - assert.equal(req.files['small0'][0].originalname, 'small0.dat') - assert.equal(req.files['small0'][0].size, 1778) - assert.equal(util.fileSize(req.files['small0'][0].path), 1778) + assert.strictEqual(req.files.small0[0].fieldname, 'small0') + assert.strictEqual(req.files.small0[0].originalname, 'small0.dat') + assert.strictEqual(req.files.small0[0].size, 1778) + assert.strictEqual(util.fileSize(req.files.small0[0].path), 1778) - assert.equal(req.files['small1'][0].fieldname, 'small1') - assert.equal(req.files['small1'][0].originalname, 'small1.dat') - assert.equal(req.files['small1'][0].size, 315) - assert.equal(util.fileSize(req.files['small1'][0].path), 315) + assert.strictEqual(req.files.small1[0].fieldname, 'small1') + assert.strictEqual(req.files.small1[0].originalname, 'small1.dat') + assert.strictEqual(req.files.small1[0].size, 315) + assert.strictEqual(util.fileSize(req.files.small1[0].path), 315) - assert.equal(req.files['medium'][0].fieldname, 'medium') - assert.equal(req.files['medium'][0].originalname, 'medium.dat') - assert.equal(req.files['medium'][0].size, 13196) - assert.equal(util.fileSize(req.files['medium'][0].path), 13196) + assert.strictEqual(req.files.medium[0].fieldname, 'medium') + assert.strictEqual(req.files.medium[0].originalname, 'medium.dat') + assert.strictEqual(req.files.medium[0].size, 13196) + assert.strictEqual(util.fileSize(req.files.medium[0].path), 13196) - assert.equal(req.files['large'][0].fieldname, 'large') - assert.equal(req.files['large'][0].originalname, 'large.jpg') - assert.equal(req.files['large'][0].size, 2413677) - assert.equal(util.fileSize(req.files['large'][0].path), 2413677) + assert.strictEqual(req.files.large[0].fieldname, 'large') + assert.strictEqual(req.files.large[0].originalname, 'large.jpg') + assert.strictEqual(req.files.large[0].size, 2413677) + assert.strictEqual(util.fileSize(req.files.large[0].path), 2413677) done() }) @@ -155,12 +156,12 @@ describe('Disk Storage', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'small0') - assert.deepEqual(err.storageErrors, []) + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'small0') + assert(deepEqual(err.storageErrors, [])) var files = fs.readdirSync(uploadDir) - assert.deepEqual(files, []) + assert(deepEqual(files, [])) done() }) @@ -178,8 +179,8 @@ describe('Disk Storage', function () { form.append('tiny0', util.file('tiny0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'ENOENT') - assert.equal(path.dirname(err.path), directory) + assert.strictEqual(err.code, 'ENOENT') + assert.strictEqual(path.dirname(err.path), directory) done() }) diff --git a/test/error-handling.js b/test/error-handling.js index a0a2a0d9..450173fb 100644 --- a/test/error-handling.js +++ b/test/error-handling.js @@ -17,7 +17,7 @@ describe('Error Handling', function () { it('should be an instance of both `Error` and `MulterError` classes in case of the Multer\'s error', function (done) { var form = new FormData() var storage = multer.diskStorage({ destination: os.tmpdir() }) - var upload = multer({storage: storage}).fields([ + var upload = multer({ storage: storage }).fields([ { name: 'small0', maxCount: 1 } ]) @@ -25,8 +25,8 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(upload, form, function (err, req) { - assert.equal(err instanceof Error, true) - assert.equal(err instanceof multer.MulterError, true) + assert.strictEqual(err instanceof Error, true) + assert.strictEqual(err instanceof multer.MulterError, true) done() }) }) @@ -41,7 +41,7 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_PART_COUNT') + assert.strictEqual(err.code, 'LIMIT_PART_COUNT') done() }) }) @@ -57,8 +57,8 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FILE_SIZE') - assert.equal(err.field, 'small0') + assert.strictEqual(err.code, 'LIMIT_FILE_SIZE') + assert.strictEqual(err.field, 'small0') done() }) }) @@ -74,7 +74,7 @@ describe('Error Handling', function () { form.append('small1', util.file('small1.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FILE_COUNT') + assert.strictEqual(err.code, 'LIMIT_FILE_COUNT') done() }) }) @@ -88,7 +88,7 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FIELD_KEY') + assert.strictEqual(err.code, 'LIMIT_FIELD_KEY') done() }) }) @@ -101,7 +101,7 @@ describe('Error Handling', function () { form.append('blowup', 'BOOM!') util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FIELD_KEY') + assert.strictEqual(err.code, 'LIMIT_FIELD_KEY') done() }) }) @@ -114,8 +114,8 @@ describe('Error Handling', function () { form.append('field1', 'This will make the parser explode') util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FIELD_VALUE') - assert.equal(err.field, 'field1') + assert.strictEqual(err.code, 'LIMIT_FIELD_VALUE') + assert.strictEqual(err.field, 'field1') done() }) }) @@ -128,7 +128,7 @@ describe('Error Handling', function () { form.append('field1', 'BOOM!') util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FIELD_COUNT') + assert.strictEqual(err.code, 'LIMIT_FIELD_COUNT') done() }) }) @@ -142,8 +142,8 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'small0') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'small0') done() }) }) @@ -165,13 +165,13 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'small0') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'small0') - assert.equal(err.storageErrors.length, 1) - assert.equal(err.storageErrors[0].code, 'TEST') - assert.equal(err.storageErrors[0].field, 'tiny0') - assert.equal(err.storageErrors[0].file, req.file) + assert.strictEqual(err.storageErrors.length, 1) + assert.strictEqual(err.storageErrors[0].code, 'TEST') + assert.strictEqual(err.storageErrors[0].field, 'tiny0') + assert.strictEqual(err.storageErrors[0].file, req.file) done() }) @@ -191,7 +191,7 @@ describe('Error Handling', function () { req.end(body) upload(req, null, function (err) { - assert.equal(err.message, 'Multipart: Boundary not found') + assert.strictEqual(err.message, 'Multipart: Boundary not found') done() }) }) @@ -217,7 +217,7 @@ describe('Error Handling', function () { req.end(body) upload(req, null, function (err) { - assert.equal(err.message, 'Unexpected end of multipart data') + assert.strictEqual(err.message, 'Unexpected end of multipart data') done() }) }) @@ -233,7 +233,7 @@ describe('Error Handling', function () { form.append('small0', util.file('small0.dat')) util.submitForm(upload, form, function (err, req) { - assert.equal(err.code, 'LIMIT_FILE_SIZE') + assert.strictEqual(err.code, 'LIMIT_FILE_SIZE') done() }) }) diff --git a/test/expected-files.js b/test/expected-files.js index 46739a92..c339a1dc 100644 --- a/test/expected-files.js +++ b/test/expected-files.js @@ -21,8 +21,8 @@ describe('Expected files', function () { form.append('notme', util.file('small0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'notme') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'notme') done() }) }) @@ -35,8 +35,8 @@ describe('Expected files', function () { form.append('notme', util.file('small1.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'notme') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'notme') done() }) }) @@ -49,8 +49,8 @@ describe('Expected files', function () { form.append('butme', util.file('small1.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'butme') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'butme') done() }) }) @@ -69,8 +69,8 @@ describe('Expected files', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files['butme'].length, 2) - assert.equal(req.files['andme'].length, 1) + assert.strictEqual(req.files.butme.length, 2) + assert.strictEqual(req.files.andme.length, 1) done() }) @@ -89,8 +89,8 @@ describe('Expected files', function () { form.append('notme', util.file('empty.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(err.field, 'notme') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(err.field, 'notme') done() }) }) @@ -105,10 +105,10 @@ describe('Expected files', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files.length, 3) - assert.equal(req.files[0].fieldname, 'butme') - assert.equal(req.files[1].fieldname, 'butme') - assert.equal(req.files[2].fieldname, 'andme') + assert.strictEqual(req.files.length, 3) + assert.strictEqual(req.files[0].fieldname, 'butme') + assert.strictEqual(req.files[1].fieldname, 'butme') + assert.strictEqual(req.files[2].fieldname, 'andme') done() }) }) diff --git a/test/express-integration.js b/test/express-integration.js index b86429df..87ab8869 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -49,7 +49,7 @@ describe('Express Integration', function () { }) router.use(function (err, req, res, next) { - assert.equal(err.code, 'LIMIT_FILE_SIZE') + assert.strictEqual(err.code, 'LIMIT_FILE_SIZE') errorCalled++ res.status(500).end('ERROR') @@ -59,10 +59,10 @@ describe('Express Integration', function () { submitForm(form, '/t1/profile', function (err, res, body) { assert.ifError(err) - assert.equal(routeCalled, 0) - assert.equal(errorCalled, 1) - assert.equal(body.toString(), 'ERROR') - assert.equal(res.statusCode, 500) + assert.strictEqual(routeCalled, 0) + assert.strictEqual(errorCalled, 1) + assert.strictEqual(body.toString(), 'ERROR') + assert.strictEqual(res.statusCode, 500) done() }) @@ -88,7 +88,7 @@ describe('Express Integration', function () { }) router.use(function (err, req, res, next) { - assert.equal(err.message, 'TEST') + assert.strictEqual(err.message, 'TEST') errorCalled++ res.status(500).end('ERROR') @@ -98,10 +98,10 @@ describe('Express Integration', function () { submitForm(form, '/t2/profile', function (err, res, body) { assert.ifError(err) - assert.equal(routeCalled, 0) - assert.equal(errorCalled, 1) - assert.equal(body.toString(), 'ERROR') - assert.equal(res.statusCode, 500) + assert.strictEqual(routeCalled, 0) + assert.strictEqual(errorCalled, 1) + assert.strictEqual(body.toString(), 'ERROR') + assert.strictEqual(res.statusCode, 500) done() }) diff --git a/test/fields.js b/test/fields.js index 29ec14f1..1bdf6459 100644 --- a/test/fields.js +++ b/test/fields.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ var assert = require('assert') +var deepEqual = require('deep-equal') var stream = require('stream') var util = require('./_util') @@ -24,11 +25,11 @@ describe('Fields', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, { + assert(deepEqual(req.body, { name: 'Multer', key: 'value', abc: 'xyz' - }) + })) done() }) }) @@ -48,14 +49,14 @@ describe('Fields', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, { + assert(deepEqual(req.body, { name: 'Multer', key: '', abc: '', - checkboxfull: [ 'cb1', 'cb2' ], - checkboxhalfempty: [ 'cb1', '' ], - checkboxempty: [ '', '' ] - }) + checkboxfull: ['cb1', 'cb2'], + checkboxhalfempty: ['cb1', ''], + checkboxempty: ['', ''] + })) done() }) }) @@ -72,8 +73,8 @@ describe('Fields', function () { parser(req, null, function (err) { assert.ifError(err) - assert.equal(req.hasOwnProperty('body'), false) - assert.equal(req.hasOwnProperty('files'), false) + assert.strictEqual(Object.prototype.hasOwnProperty.call(req, 'body'), false) + assert.strictEqual(Object.prototype.hasOwnProperty.call(req, 'files'), false) done() }) }) @@ -90,8 +91,8 @@ describe('Fields', function () { parser(req, null, function (err) { assert.ifError(err) - assert.equal(req.hasOwnProperty('body'), false) - assert.equal(req.hasOwnProperty('files'), false) + assert.strictEqual(Object.prototype.hasOwnProperty.call(req, 'body'), false) + assert.strictEqual(Object.prototype.hasOwnProperty.call(req, 'files'), false) done() }) }) @@ -106,7 +107,7 @@ describe('Fields', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, test.expected) + assert(deepEqual(req.body, test.expected)) done() }) }) @@ -121,13 +122,13 @@ describe('Fields', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, { + assert(deepEqual(req.body, { obj: { - '0': 'a', - '2': 'c', - 'x': 'yz' + 0: 'a', + 2: 'c', + x: 'yz' } - }) + })) done() }) }) diff --git a/test/file-filter.js b/test/file-filter.js index ff9d14ce..1d857f44 100644 --- a/test/file-filter.js +++ b/test/file-filter.js @@ -32,11 +32,11 @@ describe('File Filter', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files['notme'], undefined) - assert.equal(req.files['butme'][0].fieldname, 'butme') - assert.equal(req.files['butme'][0].originalname, 'tiny1.dat') - assert.equal(req.files['butme'][0].size, 7) - assert.equal(req.files['butme'][0].buffer.length, 7) + assert.strictEqual(req.files.notme, undefined) + assert.strictEqual(req.files.butme[0].fieldname, 'butme') + assert.strictEqual(req.files.butme[0].originalname, 'tiny1.dat') + assert.strictEqual(req.files.butme[0].size, 7) + assert.strictEqual(req.files.butme[0].buffer.length, 7) done() }) }) @@ -49,7 +49,7 @@ describe('File Filter', function () { form.append('test', util.file('tiny0.dat')) util.submitForm(parser, form, function (err, req) { - assert.equal(err.message, 'Fake error') + assert.strictEqual(err.message, 'Fake error') done() }) }) diff --git a/test/file-ordering.js b/test/file-ordering.js index 293ae0e7..61008afa 100644 --- a/test/file-ordering.js +++ b/test/file-ordering.js @@ -39,9 +39,9 @@ describe('File ordering', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files.length, 2) - assert.equal(req.files[0].originalname, 'small0.dat') - assert.equal(req.files[1].originalname, 'small1.dat') + assert.strictEqual(req.files.length, 2) + assert.strictEqual(req.files[0].originalname, 'small0.dat') + assert.strictEqual(req.files[1].originalname, 'small1.dat') done() }) }) diff --git a/test/functionality.js b/test/functionality.js index 513c47d6..a4db245a 100644 --- a/test/functionality.js +++ b/test/functionality.js @@ -52,7 +52,7 @@ describe('Functionality', function () { util.submitForm(parser, env.form, function (err, req) { assert.ifError(err) assert.ok(startsWith(req.file.path, env.uploadDir)) - assert.equal(util.fileSize(req.file.path), 1778) + assert.strictEqual(util.fileSize(req.file.path), 1778) done() }) }) @@ -67,7 +67,7 @@ describe('Functionality', function () { util.submitForm(parser, env.form, function (err, req) { assert.ifError(err) - assert.equal(req.file.filename, 'small0small0.dat') + assert.strictEqual(req.file.filename, 'small0small0.dat') done() }) }) @@ -82,7 +82,7 @@ describe('Functionality', function () { util.submitForm(parser, env.form, function (err, req) { assert.ifError(err) - assert.equal(req.file.filename, 'tiny0tiny0.dat') + assert.strictEqual(req.file.filename, 'tiny0tiny0.dat') done() }) }) @@ -98,9 +98,9 @@ describe('Functionality', function () { util.submitForm(parser, env.form, function (err, req) { assert.ifError(err) - assert.equal(req.files.length, 2) - assert.equal(req.files[0].filename, 'themFilessmall0.dat') - assert.equal(req.files[1].filename, 'themFilessmall1.dat') + assert.strictEqual(req.files.length, 2) + assert.strictEqual(req.files[0].filename, 'themFilessmall0.dat') + assert.strictEqual(req.files[1].filename, 'themFilessmall1.dat') done() }) }) @@ -128,7 +128,7 @@ describe('Functionality', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files.length, 2) + assert.strictEqual(req.files.length, 2) assert.ok(req.files[0].path.indexOf('/testforme-') >= 0) assert.ok(req.files[1].path.indexOf('/testforme-') >= 0) done() diff --git a/test/issue-232.js b/test/issue-232.js index 4ce0f107..aeddcb95 100644 --- a/test/issue-232.js +++ b/test/issue-232.js @@ -34,8 +34,8 @@ describe('Issue #232', function () { util.submitForm(parser, form, function (err, req) { assert.ok(err, 'an error was given') - assert.equal(err.code, 'LIMIT_FILE_SIZE') - assert.equal(err.field, 'file') + assert.strictEqual(err.code, 'LIMIT_FILE_SIZE') + assert.strictEqual(err.field, 'file') done() }) diff --git a/test/memory-storage.js b/test/memory-storage.js index 5ff79d96..cbc3e2e5 100644 --- a/test/memory-storage.js +++ b/test/memory-storage.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ var assert = require('assert') +var deepEqual = require('deep-equal') var util = require('./_util') var multer = require('../') @@ -24,12 +25,12 @@ describe('Memory Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.body.name, 'Multer') + assert.strictEqual(req.body.name, 'Multer') - assert.equal(req.file.fieldname, 'small0') - assert.equal(req.file.originalname, 'small0.dat') - assert.equal(req.file.size, 1778) - assert.equal(req.file.buffer.length, 1778) + assert.strictEqual(req.file.fieldname, 'small0') + assert.strictEqual(req.file.originalname, 'small0.dat') + assert.strictEqual(req.file.size, 1778) + assert.strictEqual(req.file.buffer.length, 1778) done() }) @@ -53,19 +54,19 @@ describe('Memory Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.body.name, 'Multer') - assert.equal(req.body.version, '') - assert.equal(req.body.year, '') + assert.strictEqual(req.body.name, 'Multer') + assert.strictEqual(req.body.version, '') + assert.strictEqual(req.body.year, '') - assert.deepEqual(req.body.checkboxfull, [ 'cb1', 'cb2' ]) - assert.deepEqual(req.body.checkboxhalfempty, [ 'cb1', '' ]) - assert.deepEqual(req.body.checkboxempty, [ '', '' ]) + assert(deepEqual(req.body.checkboxfull, ['cb1', 'cb2'])) + assert(deepEqual(req.body.checkboxhalfempty, ['cb1', ''])) + assert(deepEqual(req.body.checkboxempty, ['', ''])) - assert.equal(req.file.fieldname, 'empty') - assert.equal(req.file.originalname, 'empty.dat') - assert.equal(req.file.size, 0) - assert.equal(req.file.buffer.length, 0) - assert.equal(Buffer.isBuffer(req.file.buffer), true) + assert.strictEqual(req.file.fieldname, 'empty') + assert.strictEqual(req.file.originalname, 'empty.dat') + assert.strictEqual(req.file.size, 0) + assert.strictEqual(req.file.buffer.length, 0) + assert.strictEqual(Buffer.isBuffer(req.file.buffer), true) done() }) @@ -94,42 +95,42 @@ describe('Memory Storage', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.deepEqual(req.body, {}) - - assert.equal(req.files['empty'][0].fieldname, 'empty') - assert.equal(req.files['empty'][0].originalname, 'empty.dat') - assert.equal(req.files['empty'][0].size, 0) - assert.equal(req.files['empty'][0].buffer.length, 0) - - assert.equal(req.files['tiny0'][0].fieldname, 'tiny0') - assert.equal(req.files['tiny0'][0].originalname, 'tiny0.dat') - assert.equal(req.files['tiny0'][0].size, 122) - assert.equal(req.files['tiny0'][0].buffer.length, 122) - - assert.equal(req.files['tiny1'][0].fieldname, 'tiny1') - assert.equal(req.files['tiny1'][0].originalname, 'tiny1.dat') - assert.equal(req.files['tiny1'][0].size, 7) - assert.equal(req.files['tiny1'][0].buffer.length, 7) - - assert.equal(req.files['small0'][0].fieldname, 'small0') - assert.equal(req.files['small0'][0].originalname, 'small0.dat') - assert.equal(req.files['small0'][0].size, 1778) - assert.equal(req.files['small0'][0].buffer.length, 1778) - - assert.equal(req.files['small1'][0].fieldname, 'small1') - assert.equal(req.files['small1'][0].originalname, 'small1.dat') - assert.equal(req.files['small1'][0].size, 315) - assert.equal(req.files['small1'][0].buffer.length, 315) - - assert.equal(req.files['medium'][0].fieldname, 'medium') - assert.equal(req.files['medium'][0].originalname, 'medium.dat') - assert.equal(req.files['medium'][0].size, 13196) - assert.equal(req.files['medium'][0].buffer.length, 13196) - - assert.equal(req.files['large'][0].fieldname, 'large') - assert.equal(req.files['large'][0].originalname, 'large.jpg') - assert.equal(req.files['large'][0].size, 2413677) - assert.equal(req.files['large'][0].buffer.length, 2413677) + assert(deepEqual(req.body, {})) + + assert.strictEqual(req.files.empty[0].fieldname, 'empty') + assert.strictEqual(req.files.empty[0].originalname, 'empty.dat') + assert.strictEqual(req.files.empty[0].size, 0) + assert.strictEqual(req.files.empty[0].buffer.length, 0) + + assert.strictEqual(req.files.tiny0[0].fieldname, 'tiny0') + assert.strictEqual(req.files.tiny0[0].originalname, 'tiny0.dat') + assert.strictEqual(req.files.tiny0[0].size, 122) + assert.strictEqual(req.files.tiny0[0].buffer.length, 122) + + assert.strictEqual(req.files.tiny1[0].fieldname, 'tiny1') + assert.strictEqual(req.files.tiny1[0].originalname, 'tiny1.dat') + assert.strictEqual(req.files.tiny1[0].size, 7) + assert.strictEqual(req.files.tiny1[0].buffer.length, 7) + + assert.strictEqual(req.files.small0[0].fieldname, 'small0') + assert.strictEqual(req.files.small0[0].originalname, 'small0.dat') + assert.strictEqual(req.files.small0[0].size, 1778) + assert.strictEqual(req.files.small0[0].buffer.length, 1778) + + assert.strictEqual(req.files.small1[0].fieldname, 'small1') + assert.strictEqual(req.files.small1[0].originalname, 'small1.dat') + assert.strictEqual(req.files.small1[0].size, 315) + assert.strictEqual(req.files.small1[0].buffer.length, 315) + + assert.strictEqual(req.files.medium[0].fieldname, 'medium') + assert.strictEqual(req.files.medium[0].originalname, 'medium.dat') + assert.strictEqual(req.files.medium[0].size, 13196) + assert.strictEqual(req.files.medium[0].buffer.length, 13196) + + assert.strictEqual(req.files.large[0].fieldname, 'large') + assert.strictEqual(req.files.large[0].originalname, 'large.jpg') + assert.strictEqual(req.files.large[0].size, 2413677) + assert.strictEqual(req.files.large[0].buffer.length, 2413677) done() }) diff --git a/test/none.js b/test/none.js index c31b82b2..b8e2945b 100644 --- a/test/none.js +++ b/test/none.js @@ -22,10 +22,10 @@ describe('None', function () { util.submitForm(parser, form, function (err, req) { assert.ok(err) - assert.equal(err.code, 'LIMIT_UNEXPECTED_FILE') - assert.equal(req.files, undefined) - assert.equal(req.body['key1'], 'val1') - assert.equal(req.body['key2'], 'val2') + assert.strictEqual(err.code, 'LIMIT_UNEXPECTED_FILE') + assert.strictEqual(req.files, undefined) + assert.strictEqual(req.body.key1, 'val1') + assert.strictEqual(req.body.key2, 'val2') done() }) }) @@ -38,9 +38,9 @@ describe('None', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.files, undefined) - assert.equal(req.body['key1'], 'val1') - assert.equal(req.body['key2'], 'val2') + assert.strictEqual(req.files, undefined) + assert.strictEqual(req.body.key1, 'val1') + assert.strictEqual(req.body.key2, 'val2') done() }) }) diff --git a/test/reuse-middleware.js b/test/reuse-middleware.js index 75bfc347..ab287041 100644 --- a/test/reuse-middleware.js +++ b/test/reuse-middleware.js @@ -30,15 +30,15 @@ describe('Reuse Middleware', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(req.body.name, 'Multer') - assert.equal(req.body.files, '' + fileCount) - assert.equal(req.files.length, fileCount) + assert.strictEqual(req.body.name, 'Multer') + assert.strictEqual(req.body.files, '' + fileCount) + assert.strictEqual(req.files.length, fileCount) req.files.forEach(function (file) { - assert.equal(file.fieldname, 'them-files') - assert.equal(file.originalname, 'small0.dat') - assert.equal(file.size, 1778) - assert.equal(file.buffer.length, 1778) + assert.strictEqual(file.fieldname, 'them-files') + assert.strictEqual(file.originalname, 'small0.dat') + assert.strictEqual(file.size, 1778) + assert.strictEqual(file.buffer.length, 1778) }) if (--pending === 0) done() diff --git a/test/select-field.js b/test/select-field.js index 5ed0aed1..a3a3eea0 100644 --- a/test/select-field.js +++ b/test/select-field.js @@ -23,11 +23,11 @@ function generateForm () { function assertSet (files, setName, fileNames) { var len = fileNames.length - assert.equal(files.length, len) + assert.strictEqual(files.length, len) for (var i = 0; i < len; i++) { - assert.equal(files[i].fieldname, setName) - assert.equal(files[i].originalname, fileNames[i]) + assert.strictEqual(files[i].fieldname, setName) + assert.strictEqual(files[i].originalname, fileNames[i]) } } @@ -49,16 +49,16 @@ describe('Select Field', function () { var file file = req.files['CA$|-|'][0] - assert.equal(file.fieldname, 'CA$|-|') - assert.equal(file.originalname, 'empty.dat') + assert.strictEqual(file.fieldname, 'CA$|-|') + assert.strictEqual(file.originalname, 'empty.dat') file = req.files['set-1'][0] - assert.equal(file.fieldname, 'set-1') - assert.equal(file.originalname, 'tiny0.dat') + assert.strictEqual(file.fieldname, 'set-1') + assert.strictEqual(file.originalname, 'tiny0.dat') file = req.files['set-2'][0] - assert.equal(file.fieldname, 'set-2') - assert.equal(file.originalname, 'tiny1.dat') + assert.strictEqual(file.fieldname, 'set-2') + assert.strictEqual(file.originalname, 'tiny1.dat') done() }) @@ -68,9 +68,9 @@ describe('Select Field', function () { util.submitForm(parser, generateForm(), function (err, req) { assert.ifError(err) - assertSet(req.files['CA$|-|'], 'CA$|-|', [ 'empty.dat' ]) - assertSet(req.files['set-1'], 'set-1', [ 'tiny0.dat', 'empty.dat', 'tiny1.dat' ]) - assertSet(req.files['set-2'], 'set-2', [ 'tiny1.dat', 'tiny0.dat', 'empty.dat' ]) + assertSet(req.files['CA$|-|'], 'CA$|-|', ['empty.dat']) + assertSet(req.files['set-1'], 'set-1', ['tiny0.dat', 'empty.dat', 'tiny1.dat']) + assertSet(req.files['set-2'], 'set-2', ['tiny1.dat', 'tiny0.dat', 'empty.dat']) done() }) diff --git a/test/unicode.js b/test/unicode.js index 85aca4c4..b7f98214 100644 --- a/test/unicode.js +++ b/test/unicode.js @@ -43,12 +43,12 @@ describe('Unicode', function () { util.submitForm(parser, form, function (err, req) { assert.ifError(err) - assert.equal(path.basename(req.file.path), filename) - assert.equal(req.file.originalname, filename) + assert.strictEqual(path.basename(req.file.path), filename) + assert.strictEqual(req.file.originalname, filename) - assert.equal(req.file.fieldname, 'small0') - assert.equal(req.file.size, 1778) - assert.equal(util.fileSize(req.file.path), 1778) + assert.strictEqual(req.file.fieldname, 'small0') + assert.strictEqual(req.file.size, 1778) + assert.strictEqual(util.fileSize(req.file.path), 1778) done() }) From 0e3c22248eeafcf7ac1809f093a231129984ab5c Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 20:51:39 -0200 Subject: [PATCH 034/103] Fix: Multiple Typos, chars and words Modified the translation since there were a couple of misspells. --- doc/README-es.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/doc/README-es.md b/doc/README-es.md index f053cced..33e06f28 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -1,6 +1,6 @@ # Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) -Multer es un "*middleware*"" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. +Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. **NOTA**: Multer no procesará ningún formulario basado en `multipart/form-data`. @@ -13,7 +13,7 @@ Multer es un "*middleware*"" de node.js para el manejo de `multipart/form-data`, - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) -## Instralación +## Instalación ```sh $ npm install --save multer @@ -21,7 +21,7 @@ $ npm install --save multer ## Uso -Multer añade un objeto `body` y un objeto `file` o `files` al objeto `request`. El objeto `body` coniene los valores correspondientes a los campos de texto del formulario, los objetos `file` o `files` contienen los archivos que serán subidos mediante el formulario. +Multer añade un objeto `body` y un objeto `file` o `files` al objeto `request`. El objeto `body` contiene los valores correspondientes a los campos de texto del formulario, los objetos `file` o `files` contienen los archivos que serán subidos mediante el formulario. Ejemplo básico de cómo usarlo: @@ -95,7 +95,7 @@ Clave (Key) | Descripción | Nota ### `multer(opts)` -Muler acepta un objeto para configurar sus opciones, la más básica de ellas es la propiedad `dest`, la cual informa a Multer dónde debe subir los archivos. En caso de que omitas el objeto con las opciones, los archivos serán guardados en la memoria y nunca serán escritos en el disco. +Multer acepta un objeto para configurar sus opciones, la más básica de ellas es la propiedad `dest`, la cual informa a Multer dónde debe subir los archivos. En caso de que omitas el objeto con las opciones, los archivos serán guardados en la memoria y nunca serán escritos en el disco. Por defecto, Multer renombrará los archivos para evitar conflictos de nombres. La función usada para renombrarlos puede ser modificada acorde a tus necesidades. @@ -105,7 +105,7 @@ Clave (key) | Descripción --- | --- `dest` o `storage` | Donde se guardarán los archivos `fileFilter` | Función para controlar qué archivos son aceptados -`limits` | Limites de los datos de subida +`limits` | Límites de los datos de subida `preservePath` | Mantiene la dirección completa de la ubicación de los archivos, en vez de sólo sus nombres En la aplicación web promedio es probable que sólo se requiera `dest`, siendo configurado como en el siguiente ejemplo: @@ -126,10 +126,10 @@ Acepta un arreglo (array), de archivos, todos con el nombre `fieldname`. Opciona #### `.fields(fields)` -Acepta una mixtura de archivos, especificados por `field`. Un objeto con arreglos (arrays) de archivos será guardado en `req.files` +Acepta una mezcla de archivos, especificados por `field`. Un objeto con arreglos (arrays) de archivos será guardado en `req.files` -`fields` debiera ser un arreglo (array) de objetos con `name` y opcionalmente `maxCount`. -Example: +`fields` debería ser un arreglo (array) de objetos con `name` y opcionalmente `maxCount`. +Ejemplo: ```javascript [ @@ -145,9 +145,9 @@ Acepta sólo campos de texto. En caso de intentar subir un archivo, se generará #### `.any()` -Acepta todos los archivos que han sido enviado. Un arreglo (array) contieniendo los archivos será guardado en `req.files`. +Acepta todos los archivos que han sido enviado. Un arreglo (array) conteniendo los archivos será guardado en `req.files`. -**ADVERTENCIA:** Asegurate siempre manejar los archivos que los usuarios intenten subir. Nunca uses Multer como una función middleware de manera global dado que, de esta forma, un usuario malicioso podría subir archivos por medio de rutas que no has anticipado. Usa sólo esta función en rutas en las que estás esperando archivos. +**ADVERTENCIA:** Asegúrate de siempre manejar los archivos que los usuarios intenten subir. Nunca uses Multer como una función middleware de manera global dado que, de esta forma, un usuario malicioso podría subir archivos por medio de rutas que no has anticipado. Usa sólo esta función en rutas en las que estás esperando archivos. ### `storage` @@ -170,21 +170,21 @@ var upload = multer({ storage: storage }) Hay dos opciones disponibles, `destination` y `filename`. Ambas son funciones que determinan dónde debería almacenarse el archivo. -`destination` es usado para determinar la capeta en donde los archivos subidos deberían ser almacenados. Esto también puede ser informado mediante una `string` (por ejemplo: `'/tmp/uploads'`). Si ninguna propiedad `destination` es dada, entonces será usado el directorio por defecto en donde el sistema operativo almacena sus archivos temporales. +`destination` es usado para determinar la capeta en donde los archivos subidos deberían ser almacenados. Esto también puede ser informado mediante un `string` (por ejemplo: `'/tmp/uploads'`). Si ninguna propiedad `destination` es dada, entonces será usado el directorio por defecto en donde el sistema operativo almacena sus archivos temporales. -**Nota:** Al pasar `destination` como una función, tú eres el responsable de crear los directorios donde los archivos serán almacenado. Cuando una `string` es dada a `destination`, Multer se asegurará que el directorio sea creado en caso de no encontrar uno. +**Nota:** Al pasar `destination` como una función, tú eres el responsable de crear los directorios donde los archivos serán almacenados. Cuando un `string` es dada a `destination`, Multer se asegurará de que el directorio sea creado en caso de no encontrar uno. `filename` es usado para determinar cómo debería ser nombrado el archivo dentro de la carpeta. Si `filename` no es provisto, a cada archivo se le asignará un nombre aleatorio que no incluirá ninguna extensión. -**Nota:** Multer no añadirá ningúna extensión de archivos por tí, es tu función la que debería retornar un nombre completo, incluyendo también la extensión del archivo. +**Nota:** Multer no añadirá ningúna extensión de archivos por ti, es tu función la que debería retornar un nombre completo, incluyendo también la extensión del archivo. -El objeto request (`req`) y parte de la información del archivo (`file`) son pasadas a tu función para ayudar con la con la decisión en la nomenclatura. +El objeto petición (`req`) y parte de la información del archivo (`file`) son pasadas a tu función para ayudar con la decisión en la nomenclatura. Nota que `req.body` puede que no haya sido totalmente poblado todavía. Esto depende del orden en el que el cliente transmita sus campos y archivos hacia el servidor. #### `MemoryStorage` -El mecanismo de almacenamiento en memoria almacena los archivos en la memoria en la forma de objetos `Buffer`. Para esto no se proveen opciones. +El mecanismo de almacenamiento en memoria almacena los archivos en la memoria en forma de objetos `Buffer`. Para esto no se proveen opciones. ```javascript var storage = multer.memoryStorage() @@ -197,7 +197,7 @@ Al usar el almacenamiento en memoria, la información del archivo contendrá un ### `limits` -Un objeto que especifica los límites correpondientes a los tamaños de las siguientes propiedades. Multer pasa este objeto directamente a *busboy*, los detalles de las propiedades pueden encontrarse en [la página de busboy](https://github.com/mscdex/busboy#busboy-methods). +Un objeto que especifica los límites correpondientes a los tamaños de las siguientes propiedades. Multer pasa este objeto directamente a *busboy*, los detalles de las propiedades pueden encontrarse en [la página de busboy](https://github.com/mscdex/busboy#busboy-methods). Los siguientes valores en números enteros están disponibles: @@ -209,9 +209,9 @@ Clave (Key) | Descripción | Por defecto `fileSize` | Para formularios multiparte, el tamaño máximo de los archivos (en bytes) | Infinito `files` | Para los formularios multiparte, el número máximo de campos para archivos | Infinito `parts` | Para los formularios multiparte, el número máximo de partes (campos + archivos) | Infinito -`headerPairs` | Para los formularios multiparte, el número máximo de cabeceras de pares clave(key)=> valor para analizar | 2000 +`headerPairs` | Para los formularios multiparte, el número máximo de cabeceras de pares clave=>valor para analizar | 2000 -Especificar los límites puede ayudarte a protejer tu sitio contra ataques de privación del servicio (DoS). +Especificar los límites puede ayudarte a protejer tu sitio contra ataques de denegación del servicio (DoS). ### `fileFilter` @@ -239,7 +239,7 @@ function fileFilter (req, file, cb) { Al encontrarse con un error, Multer delegará ese error a Express. Puedes mostrar una linda página de error usando [la manera standard de Express](http://expressjs.com/guide/error-handling.html). -Si quieres atajar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres atajar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). +Si quieres capturar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres capturar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). ```javascript var multer = require('multer') From 52bf6c51a96e90c9f6cfed04d01390de34861449 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 20:57:26 -0200 Subject: [PATCH 035/103] docs: Add Spanish docs to Translations --- doc/README-zh-cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 62f3db03..206bf09a 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -11,6 +11,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 ## 其它语言 - [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) +- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (西班牙文) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) From 1ac657587a34e69a580a7d115cb279e1188044cd Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:02:09 -0200 Subject: [PATCH 036/103] docs: Add Spanish docs to Translations --- doc/README-ko.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/README-ko.md b/doc/README-ko.md index 12d9999f..b1a02cc9 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -8,6 +8,7 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 이 문서는 아래의 언어로도 제공됩니다: - [English](https://github.com/expressjs/multer/blob/master/README.md) +- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) From 4f77533ed2141b10e4c2d5e69a965fa31eb3b52f Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:09:42 -0200 Subject: [PATCH 037/103] docs: Fix langs translation Fixed languages to Portuguese, now matches the current language, and also fixed the structure of the languages. --- doc/README-pt-br.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index f0d89e13..dd680c8b 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -8,10 +8,11 @@ Multer é um middleware node.js para manipulação `multipart/form-data`, que é Este README também está disponível em outros idiomas: -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) -- [English](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (English) +- [English](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Inglês) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espanhol) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinês) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russo) ## Instalação From 2c00e622bf0ca30c166d60f841f130441856f8f7 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:13:42 -0200 Subject: [PATCH 038/103] docs: Add Spanish docs to Translations --- doc/README-ru.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index 0bbe5204..1dc5a0b3 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -9,9 +9,10 @@ Multer — это middleware для фреймворка express для обра Это README также доступно на других языках: - [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) +- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Испанский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (BR Португальский) ## Установка From c15684d031a847fd8b9c45661f204d72487f7d46 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:20:52 -0200 Subject: [PATCH 039/103] docs: Translated the languages to Spanish Add Portuguese BR to Translations --- doc/README-es.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/README-es.md b/doc/README-es.md index 33e06f28..ca2fb934 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -8,10 +8,11 @@ Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, Éste archivo README también está disponible en otros lenguajes: -- [Engilsh] (https://github.com/expressjs/multer/blob/master/README.md) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +- [Engilsh](https://github.com/expressjs/multer/blob/master/README.md) (Inglés) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chino) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Ruso) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portugués Brasileño) ## Instalación From 5948f1c3c8b749b2b1770ae128af76bb3028d7bd Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:23:01 -0200 Subject: [PATCH 040/103] docs: Translated "Brazilian Portuguese" to korean --- doc/README-ko.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ko.md b/doc/README-ko.md index b1a02cc9..d02dfb09 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -11,7 +11,7 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 - [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (포르투갈어 BR) ## 설치 From 993e2c0d317a49dd79c600927f044bfc4325e77d Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:25:04 -0200 Subject: [PATCH 041/103] docs: Translate "Brazilian Portuguese" to Chinese --- doc/README-zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 206bf09a..cf7c7979 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -14,7 +14,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 - [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (西班牙文) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (巴西葡萄牙语) ## 安装 From 25b5b8fec3cc873b3f2039345363b9f0f6d115f8 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:29:23 -0200 Subject: [PATCH 042/103] docs: Add spanish translation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3ec0dcc..46081407 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,11 @@ on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. This README is also available in other languages: +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Spanish) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brazil) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portuguese Brazil) ## Installation From ac61c2ba0f0957d9e784bef7502497b54d0fd4dd Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:31:31 -0200 Subject: [PATCH 043/103] docs: Add korean translation of english --- doc/README-ko.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README-ko.md b/doc/README-ko.md index d02dfb09..3d705567 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -7,8 +7,8 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 ## 번역 이 문서는 아래의 언어로도 제공됩니다: -- [English](https://github.com/expressjs/multer/blob/master/README.md) -- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) +- [English](https://github.com/expressjs/multer/blob/master/README.md) (영어) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (포르투갈어 BR) From 62e159a964108d010a949a1ab1ff8166622341c9 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:33:36 -0200 Subject: [PATCH 044/103] docs: translated Spanish from Translation --- doc/README-zh-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index cf7c7979..fb592fba 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -11,7 +11,7 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 ## 其它语言 - [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) -- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (西班牙文) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (西班牙文) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (巴西葡萄牙语) From 47d888f56a4e716d0f12595110cf5b0bdea81933 Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:34:55 -0200 Subject: [PATCH 045/103] docs: translated Spanish from Translation --- doc/README-ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index 1dc5a0b3..3c29c04e 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -9,7 +9,7 @@ Multer — это middleware для фреймворка express для обра Это README также доступно на других языках: - [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) -- [Spanish](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Испанский) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Испанский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (BR Португальский) From 22056c0920e0131cacb573cea8687d1656e5a26c Mon Sep 17 00:00:00 2001 From: -Robinson Chaplain <51316342+x-N0@users.noreply.github.com> Date: Thu, 15 Oct 2020 21:36:07 -0200 Subject: [PATCH 046/103] docs: fix BR typo --- doc/README-ru.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-ru.md b/doc/README-ru.md index 3c29c04e..4d797b5e 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -12,7 +12,7 @@ Multer — это middleware для фреймворка express для обра - [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Испанский) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (BR Португальский) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (бр Португальский) ## Установка From 2c2251956297a9e4c86970262cba41c1e870dc50 Mon Sep 17 00:00:00 2001 From: Henrique-Moura <73261812+Henrique-Moura@users.noreply.github.com> Date: Tue, 13 Jul 2021 15:26:23 -0300 Subject: [PATCH 047/103] Update README-pt-br.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Linha 65 formulário está com um typo. --- doc/README-pt-br.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index f0d89e13..323e69db 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -62,7 +62,7 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { }) ``` -Caso você precise lidar com forumário text-only multipart, você deve usar o método `.none()`: +Caso você precise lidar com formulário text-only multipart, você deve usar o método `.none()`: ```javascript var express = require('express') From 7cb41b59f768d96e7425e20ae801b273603756b1 Mon Sep 17 00:00:00 2001 From: jonchurch Date: Fri, 6 Aug 2021 14:49:59 -0400 Subject: [PATCH 048/103] doc: update var to const in all Readmes --- README.md | 36 ++++++++++++++++++------------------ doc/README-es.md | 32 ++++++++++++++++---------------- doc/README-ko.md | 30 +++++++++++++++--------------- doc/README-pt-br.md | 32 ++++++++++++++++---------------- doc/README-ru.md | 32 ++++++++++++++++---------------- doc/README-zh-cn.md | 32 ++++++++++++++++---------------- 6 files changed, 97 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index d3ec0dcc..32c2cc30 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ Don't forget the `enctype="multipart/form-data"` in your form. ``` ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file is the `avatar` file @@ -51,7 +51,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body will contain the text fields, if there were any }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files // @@ -66,10 +66,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { In case you need to handle a text-only multipart form, you should use the `.none()` method: ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { // req.body contains the text fields @@ -91,8 +91,8 @@ Here's an example on how multer is used an HTML form. Take special note of the ` Then in your javascript file you would add these lines to access both the file and the body. It is important that you use the `name` field value from the form in your upload function. This tells multer which field on the request it should look for the files in. If these fields aren't the same in the HTML form and on your server, your upload will fail: ```javascript -var multer = require('multer') -var upload = multer({ dest: './public/data/uploads/' }) +const multer = require('multer') +const upload = multer({ dest: './public/data/uploads/' }) app.post('/stats', upload.single('uploaded_file'), function (req, res) { // req.file is the name of your file in the form above, here 'uploaded_file' // req.body will hold the text fields, if there were any @@ -142,7 +142,7 @@ In an average web app, only `dest` might be required, and configured as shown in the following example. ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` If you want more control over your uploads, you'll want to use the `storage` @@ -197,7 +197,7 @@ where you are handling the uploaded files. The disk storage engine gives you full control on storing files to disk. ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -207,7 +207,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` There are two options available, `destination` and `filename`. They are both @@ -245,8 +245,8 @@ The memory storage engine stores the files in memory as `Buffer` objects. It doesn't have any options. ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` When using memory storage, the file info will contain a field called @@ -306,8 +306,8 @@ If you want to catch errors specifically from Multer, you can call the middleware function by yourself. Also, if you want to catch only [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), you can use the `MulterError` class that is attached to the `multer` object itself (e.g. `err instanceof multer.MulterError`). ```javascript -var multer = require('multer') -var upload = multer().single('avatar') +const multer = require('multer') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { diff --git a/doc/README-es.md b/doc/README-es.md index f053cced..9bc7a28e 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -34,11 +34,11 @@ No te olvides de `enctype="multipart/form-data"` en tu formulario. ``` ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file es el `avatar` del archivo @@ -50,7 +50,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body tendrá los campos textuales, en caso de haber alguno. }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files es un objeto (String -> Array) donde el nombre del campo es la clave (key) y el valor es el arreglo (arrya) de archivos // @@ -65,10 +65,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { En caso de que necesites manejar un formulario multiparte (multipart form) que sólo contiene campos de texto, recomendamos usar el método `.none()`: ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { // req.body contiene los campos textuales @@ -111,7 +111,7 @@ Clave (key) | Descripción En la aplicación web promedio es probable que sólo se requiera `dest`, siendo configurado como en el siguiente ejemplo: ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` Si quieres más control sobre tus subidas, tendrás que usar la opción `storage` en vez de `dest`. Multer incorpora los mecanismos de almacenamiento `DiskStorage` y `MemoryStorage`; existen otros medios provistos por terceros. @@ -156,7 +156,7 @@ Acepta todos los archivos que han sido enviado. Un arreglo (array) contieniendo El mecanismo de almacenamiento en el disco otorga completo control en la escritura de archivos en tu disco. ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -165,7 +165,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` Hay dos opciones disponibles, `destination` y `filename`. Ambas son funciones que determinan dónde debería almacenarse el archivo. @@ -187,8 +187,8 @@ Nota que `req.body` puede que no haya sido totalmente poblado todavía. Esto de El mecanismo de almacenamiento en memoria almacena los archivos en la memoria en la forma de objetos `Buffer`. Para esto no se proveen opciones. ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` Al usar el almacenamiento en memoria, la información del archivo contendrá un campo llamado `buffer` que contiene el archivo entero. @@ -242,8 +242,8 @@ Al encontrarse con un error, Multer delegará ese error a Express. Puedes mostra Si quieres atajar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres atajar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). ```javascript -var multer = require('multer') -var upload = multer().single('avatar') +const multer = require('multer') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { diff --git a/doc/README-ko.md b/doc/README-ko.md index 12d9999f..d8017265 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -25,11 +25,11 @@ Multer는 `body` 객체와 한 개의 `file` 혹은 여러개의 `files` 객체 기본 사용 예제: ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file 은 `avatar` 라는 필드의 파일 정보입니다. @@ -41,7 +41,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // 텍스트 필드가 있는 경우, req.body가 이를 포함할 것입니다. }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files는 (String -> Array) 형태의 객체 입니다. // 필드명은 객체의 key에, 파일 정보는 배열로 value에 저장됩니다. @@ -57,10 +57,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { 텍스트 전용 multipart 폼을 처리해야 하는 경우, 어떠한 multer 메소드 (`.single()`, `.array()`, `fields()`) 도 사용할 수 있습니다. 아래는 `.array()` 를 사용한 예제 입니다 : ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.array(), function (req, res, next) { // req.body는 텍스트 필드를 포함합니다. @@ -103,7 +103,7 @@ Key | Description 보통의 웹 앱에서는 `dest` 옵션 정도만 필요할지도 모릅니다. 설정 방법은 아래의 예제에 나와있습니다. ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` 만일 업로드를 더 제어하고 싶다면, `dest` 옵션 대신 `storage` 옵션을 사용할 수 있습니다. Multer는 스토리지 엔진인 `DiskStorage` 와 `MemoryStorage` 를 탑재하고 있습니다. 써드파티로부터 더 많은 엔진들을 사용할 수 있습니다. @@ -147,7 +147,7 @@ var upload = multer({ dest: 'uploads/' }) 디스크 스토리지 엔진은 파일을 디스크에 저장하기 위한 모든 제어 기능을 제공합니다. ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -156,7 +156,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` `destination` 과 `filename` 의 두가지 옵션이 가능합니다. 두 옵션 모두 파일을 어디에 저장할 지를 정하는 함수입니다. @@ -179,8 +179,8 @@ var upload = multer({ storage: storage }) 메모리 스토리지 엔진은 파일을 메모리에 `Buffer` 객체로 저장합니다. 이에 대해서는 어떤 옵션도 없습니다. ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` 메모리 스토리지 사용시, 파일 정보는 파일 전체를 포함하는 `buffer` 라고 불리는 필드를 포함할 것입니다. @@ -232,7 +232,7 @@ function fileFilter (req, file, cb) { 만일 multer 로부터 특별히 에러를 캐치하고 싶다면, 직접 미들웨어 함수를 호출하세요. ```javascript -var upload = multer().single('avatar') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index 323e69db..a0b6b994 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -34,11 +34,11 @@ Não esqueça o `enctype="multipart/form-data"` em seu formulário. ``` ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file is the `avatar` file @@ -50,7 +50,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body will contain the text fields, if there were any }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files // @@ -65,10 +65,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { Caso você precise lidar com formulário text-only multipart, você deve usar o método `.none()`: ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { // req.body contains the text fields @@ -111,7 +111,7 @@ Key | Descrição Em um web app básico, somente o `dest` pode ser necessário, e configurado como mostrado no exemplo a seguir: ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` Se você quiser mais controle sobre seus envios, você ter que usar a opção `storage` em vez de `dest`. Multer vem com motores de armazenamento `DiskStorage` e `MemoryStorage`; Mais mecanismos estão disponíveis de terceiros. @@ -159,7 +159,7 @@ Nunca adicione o Multer como global no middleware, já que um usuário mal-inten O mecanismo de armazenamento em disco oferece controle total sobre o armazenamento de arquivos em disco. ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -168,7 +168,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` Existem duas opções disponíveis, `destination` e `filename`. Ambas são funções que determinam onde o arquivo deve ser armazenado. @@ -190,8 +190,8 @@ Observe que `req.body` pode não ter sido totalmente preenchido ainda. Isso depe O mecanismo de armazenamento na memória, armazena os arquivos na memória como um objeto `Buffer`. Não tendo opções. ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` Ao usar o armazenamento de memória, as informações do arquivo conterão um campo chamado `buffer` que contém o arquivo inteiro. @@ -246,8 +246,8 @@ Quando encontrar um erro, Multer delegará o erro para Express. Você pode exibi Se você quer pegar erros especificamente do Multer, você pode enviar para o função de middleware. Além disso, se você quiser pegar apenas [os erros do Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), você pode usar a classe `MulterError` que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). ```javascript -var multer = require('multer') -var upload = multer().single('avatar') +const multer = require('multer') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { diff --git a/doc/README-ru.md b/doc/README-ru.md index 0bbe5204..debb3bd1 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -34,11 +34,11 @@ Multer добавляет объект `body` и объект `file` (или `fi ``` ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file - файл `avatar` @@ -50,7 +50,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body сохранит текстовые поля, если они будут }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files - объект (String -> Array), где fieldname - ключ, и значение - массив файлов // @@ -65,10 +65,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { Если вам нужно обработать multipart-форму, содержащую только текст, используйте метод `.none()`: ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { // req.body содержит текстовые поля @@ -111,7 +111,7 @@ Multer принимает объект с опциями. Базовая опц Обычно для веб-приложения нужно обязательно переопределить `dest`, как показано в примере ниже. ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` Если вам нужно больше возможностей для управления приложением, можно использовать `storage` вместо `dest`. Multer поставляется с двумя движками работы с памятью, `DiskStorage` и `MemoryStorage`, другие движки можно найти у сторонних разработчиков. @@ -154,7 +154,7 @@ var upload = multer({ dest: 'uploads/' }) Движок дискового пространства. Дает полный контроль над размещением файлов на диск. ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -163,7 +163,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` Доступно две опции, расположение `destination` и имя файла `filename`. Обе эти функции определяют, где будет находиться файл после загрузки. @@ -186,8 +186,8 @@ var upload = multer({ storage: storage }) Движок оперативной памяти сохраняет файлы в памяти как объекты типа `Buffer`. В этом случае нет никаких дополнительных опций. ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` Когда вы используете этот тип передачи, информация о файле будет содержать поле `buffer`, которое содержит весь файл. @@ -241,8 +241,8 @@ function fileFilter (req, file, cb) { Если вы хотите отлавливать ошибки конкретно от Multer, вам нужно вызывать собственную middleware для их обработки. Еще, если вы хотите отлавливать [исключительно ошибки Multer](https://github.com/expressjs/multer/blob/master/lib/make-error.js#L1-L9), вы можете использовать класс `MulterError`, который привязан к объекту `multer` (например, `err instanceof multer.MulterError`) ```javascript -var multer = require('multer') -var upload = multer().single('avatar') +const multer = require('multer') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 62f3db03..ea9eeef4 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -29,11 +29,11 @@ Multer 会添加一个 `body` 对象 以及 `file` 或 `files` 对象 到 expres 基本使用方法: ```javascript -var express = require('express') -var multer = require('multer') -var upload = multer({ dest: 'uploads/' }) +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) -var app = express() +const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file 是 `avatar` 文件的信息 @@ -45,7 +45,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body 将具有文本域数据,如果存在的话 }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组 // @@ -60,10 +60,10 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { 如果你需要处理一个只有文本域的表单,你应当使用 `.none()`: ```javascript -var express = require('express') -var app = express() -var multer = require('multer') -var upload = multer() +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { // req.body 包含文本域 @@ -106,7 +106,7 @@ Key | Description 通常,一般的网页应用,只需要设置 `dest` 属性,像这样: ```javascript -var upload = multer({ dest: 'uploads/' }) +const upload = multer({ dest: 'uploads/' }) ``` 如果你想在上传时进行更多的控制,你可以使用 `storage` 选项替代 `dest`。Multer 具有 `DiskStorage` 和 `MemoryStorage` 两个存储引擎;另外还可以从第三方获得更多可用的引擎。 @@ -152,7 +152,7 @@ Example: 磁盘存储引擎可以让你控制文件的存储。 ```javascript -var storage = multer.diskStorage({ +const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, @@ -161,7 +161,7 @@ var storage = multer.diskStorage({ } }) -var upload = multer({ storage: storage }) +const upload = multer({ storage: storage }) ``` 有两个选项可用,`destination` 和 `filename`。他们都是用来确定文件存储位置的函数。 @@ -183,8 +183,8 @@ var upload = multer({ storage: storage }) 内存存储引擎将文件存储在内存中的 `Buffer` 对象,它没有任何选项。 ```javascript -var storage = multer.memoryStorage() -var upload = multer({ storage: storage }) +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) ``` 当使用内存存储引擎,文件信息将包含一个 `buffer` 字段,里面包含了整个文件数据。 @@ -236,8 +236,8 @@ function fileFilter (req, file, cb) { 如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 [Multer 错误](https://github.com/expressjs/multer/blob/master/lib/multer-error.js),你可以使用 `multer` 对象下的 `MulterError` 类 (即 `err instanceof multer.MulterError`)。 ```javascript -var multer = require('multer') -var upload = multer().single('avatar') +const multer = require('multer') +const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { From 8bea17d2aadb795ae124dc30a3b2ffbcd1abddd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Aug 2021 09:44:24 +0100 Subject: [PATCH 049/103] history: 1.4.3 --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dccc7de5..4c4baba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.3 - 2021-08-09 + +- Bugfix: Avoid deprecated pseudoRandomBytes function (#774) +- Docs: Add Português Brazil translation for README (#758) +- Docs: Clarify the callback calling convention (#775) +- Docs: Add example on how to link to html multipart form (#580) +- Docs: Add Spanish translation for README (#838) +- Docs: Add Math.random() to storage filename example (#841) +- Docs: Fix mistakes in russian doc (#869) +- Docs: Improve Português Brazil translation (#877) +- Docs: Update var to const in all Readmes (#1024) +- Internal: Bump mkdirp version (#862) +- Internal: Bump Standard version (#878) + ## 1.4.2 - 2019-07-16 - Docs: Add Russian translation for README (#662) From 63f487421baec6f20d6a0a38561698f80daa2cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Aug 2021 09:44:39 +0100 Subject: [PATCH 050/103] version: 1.4.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5610d717..da0c5ba0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.2", + "version": "1.4.3", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From c64711f0e49033e11e73b0ad4b7f4400e42bb097 Mon Sep 17 00:00:00 2001 From: Luis Orbaiceta <44276180+luisorbaiceta@users.noreply.github.com> Date: Mon, 29 Nov 2021 16:16:41 +0100 Subject: [PATCH 051/103] Fix spelling misstakes in README-es.md --- doc/README-es.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/README-es.md b/doc/README-es.md index 65d9e370..cbb8e74b 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -4,7 +4,7 @@ Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, **NOTA**: Multer no procesará ningún formulario basado en `multipart/form-data`. -## Traducciones +## Traducciones Éste archivo README también está disponible en otros lenguajes: @@ -53,7 +53,7 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { - // req.files es un objeto (String -> Array) donde el nombre del campo es la clave (key) y el valor es el arreglo (arrya) de archivos + // req.files es un objeto (String -> Array) donde el nombre del campo es la clave (key) y el valor es el arreglo (array) de archivos // // Ejemplo // req.files['avatar'][0] -> Archivo @@ -212,7 +212,7 @@ Clave (Key) | Descripción | Por defecto `parts` | Para los formularios multiparte, el número máximo de partes (campos + archivos) | Infinito `headerPairs` | Para los formularios multiparte, el número máximo de cabeceras de pares clave=>valor para analizar | 2000 -Especificar los límites puede ayudarte a protejer tu sitio contra ataques de denegación del servicio (DoS). +Especificar los límites puede ayudarte a proteger tu sitio contra ataques de denegación del servicio (DoS). ### `fileFilter` From 055767b1ae11710db540c2bc76213898a865326e Mon Sep 17 00:00:00 2001 From: Evgeny Soynov Date: Tue, 7 Dec 2021 12:36:08 +0100 Subject: [PATCH 052/103] Handle missing field names (#913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes expressjs/multer#553 Without this fix fields without a name result in a "TypeError: Cannot read property 'length' of undefined" in the underlying append-field library. The current change allows getting an error from Multer that makes it possible to handle it in servers. Co-authored-by: Linus Unnebäck --- lib/make-middleware.js | 1 + lib/multer-error.js | 3 ++- test/error-handling.js | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index d22042ee..b033cbd9 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -81,6 +81,7 @@ function makeMiddleware (setup) { // handle text field data busboy.on('field', function (fieldname, value, fieldnameTruncated, valueTruncated) { + if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME') if (fieldnameTruncated) return abortWithCode('LIMIT_FIELD_KEY') if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname) diff --git a/lib/multer-error.js b/lib/multer-error.js index 4c91d295..d56b00e8 100644 --- a/lib/multer-error.js +++ b/lib/multer-error.js @@ -7,7 +7,8 @@ var errorMessages = { LIMIT_FIELD_KEY: 'Field name too long', LIMIT_FIELD_VALUE: 'Field value too long', LIMIT_FIELD_COUNT: 'Too many fields', - LIMIT_UNEXPECTED_FILE: 'Unexpected field' + LIMIT_UNEXPECTED_FILE: 'Unexpected field', + MISSING_FIELD_NAME: 'Field name missing' } function MulterError (code, field) { diff --git a/test/error-handling.js b/test/error-handling.js index 450173fb..b462e16e 100644 --- a/test/error-handling.js +++ b/test/error-handling.js @@ -148,6 +148,33 @@ describe('Error Handling', function () { }) }) + it('should notify of missing field name', function (done) { + var req = new stream.PassThrough() + var storage = multer.memoryStorage() + var upload = multer({ storage: storage }).single('tiny0') + var boundary = 'AaB03x' + var body = [ + '--' + boundary, + 'Content-Disposition: form-data', + '', + 'test content', + '--' + boundary, + '' + ].join('\r\n') + + req.headers = { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + + req.end(body) + + upload(req, null, function (err) { + assert.strictEqual(err.code, 'MISSING_FIELD_NAME') + done() + }) + }) + it('should report errors from storage engines', function (done) { var storage = multer.memoryStorage() From 09cf1550dbc916dc403ed329e11f5004e48446cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Tue, 7 Dec 2021 12:39:04 +0100 Subject: [PATCH 053/103] history: 1.4.4 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c4baba8..9686cde2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.4 - 2021-12-07 + +- Bugfix: Handle missing field names (#913) +- Docs: Add Vietnamese translation (#803) +- Docs: Improve Spanish translation (#948) + ## 1.4.3 - 2021-08-09 - Bugfix: Avoid deprecated pseudoRandomBytes function (#774) From 4f4326a6687635411a69d70f954f48abb4bce58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Tue, 7 Dec 2021 12:39:10 +0100 Subject: [PATCH 054/103] version: 1.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da0c5ba0..6aec9996 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.3", + "version": "1.4.4", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From e081d486484bef2ef8b8ad36b13f2da70132acae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Louren=C3=A7o?= Date: Sat, 21 May 2022 23:32:42 +0100 Subject: [PATCH 055/103] fix(cve): bump busboy to fix CVE-2022-24434 --- lib/make-middleware.js | 22 +++++++--------------- package.json | 5 ++--- test/_util.js | 8 +------- test/error-handling.js | 2 +- test/express-integration.js | 3 +-- test/unicode.js | 36 +++++++++++++++++++++--------------- 6 files changed, 33 insertions(+), 43 deletions(-) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index b033cbd9..6627cf4c 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -1,7 +1,6 @@ var is = require('type-is') var Busboy = require('busboy') var extend = require('xtend') -var onFinished = require('on-finished') var appendField = require('append-field') var Counter = require('./counter') @@ -9,10 +8,6 @@ var MulterError = require('./multer-error') var FileAppender = require('./file-appender') var removeUploadedFiles = require('./remove-uploaded-files') -function drainStream (stream) { - stream.on('readable', stream.read.bind(stream)) -} - function makeMiddleware (setup) { return function multerMiddleware (req, res, next) { if (!is(req, ['multipart'])) return next() @@ -30,7 +25,7 @@ function makeMiddleware (setup) { var busboy try { - busboy = new Busboy({ headers: req.headers, limits: limits, preservePath: preservePath }) + busboy = Busboy({ headers: req.headers, limits: limits, preservePath: preservePath }) } catch (err) { return next(err) } @@ -45,12 +40,9 @@ function makeMiddleware (setup) { function done (err) { if (isDone) return isDone = true - req.unpipe(busboy) - drainStream(req) busboy.removeAllListeners() - - onFinished(req, function () { next(err) }) + next(err) } function indicateDone () { @@ -80,9 +72,9 @@ function makeMiddleware (setup) { } // handle text field data - busboy.on('field', function (fieldname, value, fieldnameTruncated, valueTruncated) { + busboy.on('field', function (fieldname, value, { nameTruncated, valueTruncated }) { if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME') - if (fieldnameTruncated) return abortWithCode('LIMIT_FIELD_KEY') + if (nameTruncated) return abortWithCode('LIMIT_FIELD_KEY') if (valueTruncated) return abortWithCode('LIMIT_FIELD_VALUE', fieldname) // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6) @@ -94,7 +86,7 @@ function makeMiddleware (setup) { }) // handle files - busboy.on('file', function (fieldname, fileStream, filename, encoding, mimetype) { + busboy.on('file', function (fieldname, fileStream, { filename, encoding, mimeType }) { // don't attach to the files object, if there is no file if (!filename) return fileStream.resume() @@ -107,7 +99,7 @@ function makeMiddleware (setup) { fieldname: fieldname, originalname: filename, encoding: encoding, - mimetype: mimetype + mimetype: mimeType } var placeholder = appender.insertPlaceholder(file) @@ -169,7 +161,7 @@ function makeMiddleware (setup) { busboy.on('partsLimit', function () { abortWithCode('LIMIT_PART_COUNT') }) busboy.on('filesLimit', function () { abortWithCode('LIMIT_FILE_COUNT') }) busboy.on('fieldsLimit', function () { abortWithCode('LIMIT_FIELD_COUNT') }) - busboy.on('finish', function () { + busboy.on('close', function () { readFinished = true indicateDone() }) diff --git a/package.json b/package.json index 6aec9996..70d535d9 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,10 @@ ], "dependencies": { "append-field": "^1.0.0", - "busboy": "^0.2.11", + "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", - "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" }, @@ -39,7 +38,7 @@ "testdata-w3c-json-form": "^1.0.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 6.0.0" }, "files": [ "LICENSE", diff --git a/test/_util.js b/test/_util.js index e62bdafc..a6782ad8 100644 --- a/test/_util.js +++ b/test/_util.js @@ -1,7 +1,6 @@ var fs = require('fs') var path = require('path') var stream = require('stream') -var onFinished = require('on-finished') exports.file = function file (name) { return fs.createReadStream(path.join(__dirname, 'files', name)) @@ -17,11 +16,6 @@ exports.submitForm = function submitForm (multer, form, cb) { var req = new stream.PassThrough() - req.complete = false - form.once('end', function () { - req.complete = true - }) - form.pipe(req) req.headers = { 'content-type': 'multipart/form-data; boundary=' + form.getBoundary(), @@ -29,7 +23,7 @@ exports.submitForm = function submitForm (multer, form, cb) { } multer(req, null, function (err) { - onFinished(req, function () { cb(err, req) }) + cb(err, req) }) }) } diff --git a/test/error-handling.js b/test/error-handling.js index b462e16e..6baad5ab 100644 --- a/test/error-handling.js +++ b/test/error-handling.js @@ -244,7 +244,7 @@ describe('Error Handling', function () { req.end(body) upload(req, null, function (err) { - assert.strictEqual(err.message, 'Unexpected end of multipart data') + assert.strictEqual(err.message, 'Unexpected end of form') done() }) }) diff --git a/test/express-integration.js b/test/express-integration.js index 87ab8869..0cda05d4 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -8,7 +8,6 @@ var util = require('./_util') var express = require('express') var FormData = require('form-data') var concat = require('concat-stream') -var onFinished = require('on-finished') var port = 34279 @@ -27,7 +26,7 @@ describe('Express Integration', function () { req.on('response', function (res) { res.on('error', cb) res.pipe(concat({ encoding: 'buffer' }, function (body) { - onFinished(req, function () { cb(null, res, body) }) + cb(null, res, body) })) }) } diff --git a/test/unicode.js b/test/unicode.js index b7f98214..851b0ebc 100644 --- a/test/unicode.js +++ b/test/unicode.js @@ -2,12 +2,10 @@ var assert = require('assert') -var path = require('path') -var util = require('./_util') var multer = require('../') var temp = require('fs-temp') var rimraf = require('rimraf') -var FormData = require('form-data') +var stream = require('stream') describe('Unicode', function () { var uploadDir, upload @@ -34,21 +32,29 @@ describe('Unicode', function () { }) it('should handle unicode filenames', function (done) { - var form = new FormData() - var parser = upload.single('small0') - var filename = '\ud83d\udca9.dat' - - form.append('small0', util.file('small0.dat'), { filename: filename }) - - util.submitForm(parser, form, function (err, req) { + var req = new stream.PassThrough() + var boundary = 'AaB03x' + var body = [ + '--' + boundary, + 'Content-Disposition: form-data; name="small0"; filename="poo.dat"; filename*=utf-8\'\'%F0%9F%92%A9.dat', + 'Content-Type: text/plain', + '', + 'test with unicode filename', + '--' + boundary + '--' + ].join('\r\n') + + req.headers = { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + + req.end(body) + + upload.single('small0')(req, null, function (err) { assert.ifError(err) - assert.strictEqual(path.basename(req.file.path), filename) - assert.strictEqual(req.file.originalname, filename) - + assert.strictEqual(req.file.originalname, '\ud83d\udca9.dat') assert.strictEqual(req.file.fieldname, 'small0') - assert.strictEqual(req.file.size, 1778) - assert.strictEqual(util.fileSize(req.file.path), 1778) done() }) From 63d28d00a5824a7b189571d08b87350a038e0b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Sun, 29 May 2022 09:22:03 +0200 Subject: [PATCH 056/103] history: 1.4.4-lts.1 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9686cde2..6485e25b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.4-lts.1 + +- Bugfix: Bump busboy to fix CVE-2022-24434 (#1097) +- Breaking: Require Node.js 6.0.0 or later (#1097) + ## 1.4.4 - 2021-12-07 - Bugfix: Handle missing field names (#913) From 59c7ef3bc5080de3203f0a0d5243a18bcf11175e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Sun, 29 May 2022 09:22:36 +0200 Subject: [PATCH 057/103] version: 1.4.4-lts.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70d535d9..625b487f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.4", + "version": "1.4.4-lts.1", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From bc5be94f109cbf1af03fc9521eac0c1f1b2ab988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 30 May 2022 17:32:29 +0200 Subject: [PATCH 058/103] history: 1.4.5-lts.1 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6485e25b..5aeb328f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.5-lts.1 + +- No changes ## 1.4.4-lts.1 - Bugfix: Bump busboy to fix CVE-2022-24434 (#1097) From ddb65bda47d4373e3e4552638935eb849662d0a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 30 May 2022 17:32:40 +0200 Subject: [PATCH 059/103] version: 1.4.5-lts.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 625b487f..8545a73d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.4-lts.1", + "version": "1.4.5-lts.1", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From 974d7120e54b1df5a31708dddd1ac134242bdd2b Mon Sep 17 00:00:00 2001 From: 3imed-jaberi Date: Sat, 9 Jul 2022 18:03:42 +0200 Subject: [PATCH 060/103] sync with latest update .. --- doc/README-ar.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/README-ar.md b/doc/README-ar.md index 51ce41e4..5497865f 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -12,9 +12,12 @@ هذا الملف متاح أيضًا بلغات أخرى: - [English](https://github.com/expressjs/multer/blob/master/README.md) (الإنجليزية) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (الإسبانية) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (الصينية) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (الكورية) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (الروسية) +- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (الفتنامية) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (البرتغالية) ## التنصيب From 541620ab291de06d02b84409d47f84b431c6fd5e Mon Sep 17 00:00:00 2001 From: Mohamed-Abdelfattah <45965447+Mohamed-Abdelfattah@users.noreply.github.com> Date: Thu, 15 Dec 2022 23:44:33 +0200 Subject: [PATCH 061/103] Update README.md to fix issue #1114 update the link for the "Node.js error handling" blog post to the archived version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 00c42744..6feccd9c 100644 --- a/README.md +++ b/README.md @@ -240,7 +240,7 @@ order that the client transmits fields and files to the server. For understanding the calling convention used in the callback (needing to pass null as the first param), refer to -[Node.js error handling](https://www.joyent.com/node-js/production/design/errors) +[Node.js error handling](https://web.archive.org/web/20220417042018/https://www.joyent.com/node-js/production/design/errors) #### `MemoryStorage` From b1c1960a32938098f2748136d918b9e17a23481c Mon Sep 17 00:00:00 2001 From: juliomontenegro Date: Sat, 7 Jan 2023 19:12:35 -0300 Subject: [PATCH 062/103] Improved documentation translation to Spanish --- doc/README-es.md | 74 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/doc/README-es.md b/doc/README-es.md index cbb8e74b..32e7d5fc 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -2,13 +2,13 @@ Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. -**NOTA**: Multer no procesará ningún formulario basado en `multipart/form-data`. +**NOTA**: Multer no procesará ningún formulario que no sea multiparte (`multipart/form-data`). ## Traducciones Éste archivo README también está disponible en otros lenguajes: -- [Engilsh](https://github.com/expressjs/multer/blob/master/README.md) (Inglés) +- [English](https://github.com/expressjs/multer/blob/master/README.md) (Inglés) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chino) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Ruso) @@ -42,13 +42,13 @@ const upload = multer({ dest: 'uploads/' }) const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { - // req.file es el `avatar` del archivo - // req.body tendrá los campos textuales, en caso de haber alguno. + // req.file es el archivo del `avatar` + // req.body contendrá los campos de texto, si los hubiera. }) app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { // req.files es el arreglo (array) de archivos `photos` - // req.body tendrá los campos textuales, en caso de haber alguno. + // req.body contendrá los campos de texto, si los hubiera. }) const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) @@ -59,11 +59,11 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files['avatar'][0] -> Archivo // req.files['gallery'] -> Array // - // req.body tendrá los campos textuales, en caso de haber alguno. + // req.body contendrá los campos de texto, si los hubiera. }) ``` -En caso de que necesites manejar un formulario multiparte (multipart form) que sólo contiene campos de texto, recomendamos usar el método `.none()`: +En caso de que necesites manejar un formulario multiparte (multipart form) que sólo contiene campos de texto, deberias usar el método `.none()`: ```javascript const express = require('express') @@ -76,6 +76,33 @@ app.post('/profile', upload.none(), function (req, res, next) { }) ``` + +Este es un ejemplo de cómo se utiliza multer en un formulario HTML. Presta especial atención en los campos `enctype="multipart/form-data"` y `name="uploaded_file"`: + +```html +
+
+ + + +
+
+``` + +Luego en tu archivo javascript agrega estas líneas para acceder tanto al archivo (file) como al body.Es importante que uses el valor del campo `name` del formulario, en tu función de subida. Esto le indica a multer en qué campo de la petición debe buscar los archivos. Si estos campos no son los mismos en el formulario HTML y en tu servidor, la subida fallará: + +```javascript +const multer = require('multer') +const upload = multer({ dest: './public/data/uploads/' }) +app.post('/stats', upload.single('uploaded_file'), function (req, res) { + // req.file es el nombre de tu archivo en el formulario anterior, en este caso 'uploaded_file' + // req.body contendrá los campos de texto, si los hubiera. + console.log(req.file, req.body) +}); +``` + + + ## API ### Información del archivo @@ -84,15 +111,15 @@ Cada archivo contiene la siguiente información: Clave (Key) | Descripción | Nota --- | --- | --- -`fieldname` | Es el nombre del campo especificado en el formulario | +`fieldname` | Nombre del campo especificado en el formulario | `originalname` | Nombre del archivo en la computadora del usuario | `encoding` | Tipo de codificación del archivo | `mimetype` | Mime type del archivo | `size` | Tamaño del archivo en Bytes | -`destination` | La carpeta en donde el archivo ha sido guardado | `DiskStorage` +`destination` | La carpeta donde se guardó el archivo | `DiskStorage` `filename` | El nombre del archivo en `destination` | `DiskStorage` -`path` | El camino completo donde se ha subido el archivo (full path) | `DiskStorage` -`buffer` | Un `Buffer` con el archivo completo | `MemoryStorage` +`path` | La ruta completa al archivo subido | `DiskStorage` +`buffer` | Un `Buffer` del archivo completo | `MemoryStorage` ### `multer(opts)` @@ -106,8 +133,8 @@ Clave (key) | Descripción --- | --- `dest` o `storage` | Donde se guardarán los archivos `fileFilter` | Función para controlar qué archivos son aceptados -`limits` | Límites de los datos de subida -`preservePath` | Mantiene la dirección completa de la ubicación de los archivos, en vez de sólo sus nombres +`limits` | Límites de los datos subidos +`preservePath` | Mantiene la ruta completa de la ubicación de los archivos, en vez de sólo sus nombres En la aplicación web promedio es probable que sólo se requiera `dest`, siendo configurado como en el siguiente ejemplo: @@ -146,7 +173,7 @@ Acepta sólo campos de texto. En caso de intentar subir un archivo, se generará #### `.any()` -Acepta todos los archivos que han sido enviado. Un arreglo (array) conteniendo los archivos será guardado en `req.files`. +Acepta todos los archivos que han sido enviados. Un arreglo (array) conteniendo los archivos, será guardado en `req.files`. **ADVERTENCIA:** Asegúrate de siempre manejar los archivos que los usuarios intenten subir. Nunca uses Multer como una función middleware de manera global dado que, de esta forma, un usuario malicioso podría subir archivos por medio de rutas que no has anticipado. Usa sólo esta función en rutas en las que estás esperando archivos. @@ -154,7 +181,7 @@ Acepta todos los archivos que han sido enviado. Un arreglo (array) conteniendo l #### `DiskStorage` -El mecanismo de almacenamiento en el disco otorga completo control en la escritura de archivos en tu disco. +El motor de almacenamiento en disco te ofrece un control total sobre el almacenamiento de archivos en tu disco. ```javascript const storage = multer.diskStorage({ @@ -171,21 +198,24 @@ const upload = multer({ storage: storage }) Hay dos opciones disponibles, `destination` y `filename`. Ambas son funciones que determinan dónde debería almacenarse el archivo. -`destination` es usado para determinar la capeta en donde los archivos subidos deberían ser almacenados. Esto también puede ser informado mediante un `string` (por ejemplo: `'/tmp/uploads'`). Si ninguna propiedad `destination` es dada, entonces será usado el directorio por defecto en donde el sistema operativo almacena sus archivos temporales. +`destination` se utiliza para determinar en qué carpeta se almacenarán los archivos subidos. Tambien se puede proporcionar como un `string` (por ejemplo: `'/tmp/uploads'`). Si no se proporciona `destination`, se utilizara el directorio predeterminado del sistema operativo para archivos temporales. -**Nota:** Al pasar `destination` como una función, tú eres el responsable de crear los directorios donde los archivos serán almacenados. Cuando un `string` es dada a `destination`, Multer se asegurará de que el directorio sea creado en caso de no encontrar uno. +**Nota:** Al pasar `destination` como una función, tú eres el responsable de crear los directorios donde los archivos serán almacenados. Cuando asignas un `string` a `destination`, Multer se asegurará de que el directorio sea creado en caso de no encontrarlo. `filename` es usado para determinar cómo debería ser nombrado el archivo dentro de la carpeta. Si `filename` no es provisto, a cada archivo se le asignará un nombre aleatorio que no incluirá ninguna extensión. -**Nota:** Multer no añadirá ningúna extensión de archivos por ti, es tu función la que debería retornar un nombre completo, incluyendo también la extensión del archivo. +**Nota:** Multer no añadirá ningúna extensión de archivos por ti, es tu función la que debería retornar un nombre completo, que incluya también la extensión del archivo. El objeto petición (`req`) y parte de la información del archivo (`file`) son pasadas a tu función para ayudar con la decisión en la nomenclatura. Nota que `req.body` puede que no haya sido totalmente poblado todavía. Esto depende del orden en el que el cliente transmita sus campos y archivos hacia el servidor. +Para comprender la convención de llamada utilizada en el callback (necesitas pasar null como primer parametro), consulta en +[Node.js manejo de errores](https://web.archive.org/web/20220417042018/https://www.joyent.com/node-js/production/design/errors) + #### `MemoryStorage` -El mecanismo de almacenamiento en memoria almacena los archivos en la memoria en forma de objetos `Buffer`. Para esto no se proveen opciones. +El motor de almacenamiento en memoria almacena los archivos en memoria como objetos `Buffer`. Para esto no se proveen opciones. ```javascript const storage = multer.memoryStorage() @@ -198,7 +228,7 @@ Al usar el almacenamiento en memoria, la información del archivo contendrá un ### `limits` -Un objeto que especifica los límites correpondientes a los tamaños de las siguientes propiedades. Multer pasa este objeto directamente a *busboy*, los detalles de las propiedades pueden encontrarse en [la página de busboy](https://github.com/mscdex/busboy#busboy-methods). +Un objeto especifica los límites correpondientes a los tamaños de las siguientes propiedades opcionales. Multer pasa este objeto directamente a *busboy*, los detalles de las propiedades pueden encontrarse en [la página de busboy](https://github.com/mscdex/busboy#busboy-methods). Los siguientes valores en números enteros están disponibles: @@ -206,7 +236,7 @@ Clave (Key) | Descripción | Por defecto --- | --- | --- `fieldNameSize` | Tamaño máximo del nombre del campo | 100 bytes `fieldSize` | Tamaño máximo de los valores para cada campo (en bytes) | 1MB -`fields` | Número máximo de la cantidad de campos | Infinito +`fields` | Número máximo de campos que no son archivos | Infinito `fileSize` | Para formularios multiparte, el tamaño máximo de los archivos (en bytes) | Infinito `files` | Para los formularios multiparte, el número máximo de campos para archivos | Infinito `parts` | Para los formularios multiparte, el número máximo de partes (campos + archivos) | Infinito @@ -216,7 +246,7 @@ Especificar los límites puede ayudarte a proteger tu sitio contra ataques de de ### `fileFilter` -Asigna ésto a una función que controle cuáles archivos deben ser subidos y cuáles deben ser omitidos. La función debería verse como ésta: +Asigna ésto a una función para controlar cuáles archivos deben ser subidos y cuáles deben ser omitidos. La función debería verse como ésta: ```javascript function fileFilter (req, file, cb) { From 44b7ab51b44688f6a8d1a7b071127fcd72874251 Mon Sep 17 00:00:00 2001 From: eleveS1 Date: Sat, 28 Jan 2023 12:39:29 +0100 Subject: [PATCH 063/103] Translated to french --- README.md | 21 +-- doc/README-fr.md | 334 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 345 insertions(+), 10 deletions(-) create mode 100644 doc/README-fr.md diff --git a/README.md b/README.md index 6feccd9c..ea9ccdb5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. **NOTE**: Multer will not process any form which is not multipart (`multipart/form-data`). -## Translations +## Translations This README is also available in other languages: @@ -16,6 +16,7 @@ This README is also available in other languages: - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) - [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnam) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portuguese Brazil) +- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (French) ## Installation @@ -33,7 +34,7 @@ Don't forget the `enctype="multipart/form-data"` in your form. ```html
- +
``` @@ -83,11 +84,11 @@ Here's an example on how multer is used an HTML form. Take special note of the ` ```html
-
- - - -
+
+ + + +
``` @@ -97,9 +98,9 @@ Then in your javascript file you would add these lines to access both the file a const multer = require('multer') const upload = multer({ dest: './public/data/uploads/' }) app.post('/stats', upload.single('uploaded_file'), function (req, res) { - // req.file is the name of your file in the form above, here 'uploaded_file' - // req.body will hold the text fields, if there were any - console.log(req.file, req.body) + // req.file is the name of your file in the form above, here 'uploaded_file' + // req.body will hold the text fields, if there were any + console.log(req.file, req.body) }); ``` diff --git a/doc/README-fr.md b/doc/README-fr.md new file mode 100644 index 00000000..53fc9d4a --- /dev/null +++ b/doc/README-fr.md @@ -0,0 +1,334 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer est un middleware node.js pour la gestion des données `multipart/form-data` qui est principalement utilisé pour télécharger des fichiers. +Il est écrit au-dessus de [busboy](https://github.com/mscdex/busboy) pour une efficacité maximale. + +**NOTE**: Multer ne traitera aucun formulaire qui ne soit pas un multipart (`multipart/form-data`). + +## Translations + +This README is also available in other languages: + +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Arabe) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espagnol) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinois) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coréen) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russe) +- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnamien) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portugais du Brésil) +- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (Français) + +## Installation + +```sh +$ npm install --save multer +``` + +## Usage + +Multer ajoute un objet `body` et un objet `file` ou `files` à l'objet `request`. L'objet `body` contient les valeurs des champs texte du formulaire, l'objet `file` ou `files` contient les fichiers téléchargés via le formulaire. + +Exemple d'utilisation de base : + +N'oubliez pas le `enctype="multipart/form-data"` dans votre formulaire. + +```html +
+ +
+``` + +```javascript +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) + +const app = express() + +app.post('/profile', upload.single('avatar'), function (req, res, next) { + // req.file est le fichier `avatar` + // req.body contiendra les champs de texte, s'il y en avait +}) + +app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { + // req.files est un tableau de fichiers "photos" + // req.body contiendra les champs de texte, s'il y en avait +}) + +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', cpUpload, function (req, res, next) { + // req.files est un objet (String -> Array) où fieldname est la clé et la valeur est un tableau de fichiers + // + // e.g. + // req.files['avatar'][0] -> Fichier + // req.files['gallery'] -> Tableau + // + // req.body contiendra les champs de texte, s'il y en avait +}) +``` + +Dans le cas où vous auriez besoin de gérer un formulaire en plusieurs parties texte uniquement, vous devez utiliser la méthode `.none()`: + +```javascript +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() + +app.post('/profile', upload.none(), function (req, res, next) { + // req.body contiens les champs de text +}) +``` + +Voici un exemple d'utilisation de multer dans un formulaire HTML. Faites particulièrement attention aux champs `enctype="multipart/form-data"` et `name="uploaded_file"`: + +```html +
+
+ + + +
+
+``` + +Ensuite, dans votre fichier javascript, vous ajouterez ces lignes pour accéder à la fois au fichier et au corps. Il est important que vous utilisiez la valeur du champ `name` du formulaire dans votre fonction de téléchargement. Cela indique à Multer dans quel champ de la requête il doit rechercher les fichiers. Si ces champs ne sont pas les mêmes dans le formulaire HTML et sur votre serveur, votre téléchargement échouera: +```javascript +const multer = require('multer') +const upload = multer({ dest: './public/data/uploads/' }) +app.post('/stats', upload.single('uploaded_file'), function (req, res) { + // req.file est le nom de votre fichier dans le formulaire ci-dessus, ici 'uploaded_file' + // req.body contiendra les champs de texte, s'il y en avait + console.log(req.file, req.body) +}); +``` + + + +## API + +### Informations sur les fichiers + +Chaque fichier contient les informations suivantes: + +Clé | Description | Notes +--- |------------------------------------------------| --- +`fieldname` | Nom du champ spécifié dans le formulaire | +`originalname` | Nom du fichier sur l'ordinateur de l'utilisateur | +`encoding` | Type d'encodage du fichier | +`mimetype` | Type Mime du fichier | +`size` | Taille du fichier en octets | +`destination` | TLe dossier dans lequel le fichier a été enregistré | `DiskStorage` +`filename` | Le nom du fichier dans la `destination` | `DiskStorage` +`path` | Le chemin d'accès complet au fichier téléchargé | `DiskStorage` +`buffer` | Un `Buffer` du fichier entier | `MemoryStorage` + +### `multer(opts)` + +Multer accepte un objet d'options, dont le plus basique est le `dest` +propriété, qui indique à Multer où télécharger les fichiers. Au cas où vous omettez l'objet +options, les fichiers seront conservés en mémoire et ne seront jamais écrits sur le disque. + +Par défaut, Multer renommera les fichiers afin d'éviter les conflits de nommage. Les +la fonction de renommage peut être personnalisée en fonction de vos besoins. + +Voici les options qui peuvent être transmises à Multer. + +Clé | Description +--- | --- +`dest` ou `storage` | Où stocker les fichiers +`fileFilter` | Fonction pour contrôler quels fichiers sont acceptés +`limits` | Limites des données téléchargées +`preservePath` | Conservez le chemin complet des fichiers au lieu du nom de base uniquement + +Dans une application Web moyenne, seul `dest` peut être requis et configuré comme indiqué dans +l'exemple suivant. + +```javascript +const upload = multer({ dest: 'uploads/' }) +``` + +Si vous voulez plus de contrôle sur vos téléchargements, vous voudrez utiliser le `storage` +option au lieu de `dest`. Multer est livré avec des moteurs de stockage `DiskStorage` +et `MemoryStorage`; D'autres moteurs sont disponibles auprès de tiers. + +#### `.single(fieldname)` + +Acceptez un seul fichier avec le nom `fieldname`. Le fichier unique sera stocké +dans `req.file`. + +#### `.array(fieldname[, maxCount])` + +Acceptez un tableau de fichiers, tous avec le nom `fieldname`. Eventuellement erreur si +plus de `maxCount` fichiers sont téléchargés. Le tableau de fichiers sera stocké dans +`req.files`. + +#### `.fields(fields)` + +Accepte un mélange de fichiers, spécifié par `fields`. Un objet avec des tableaux de fichiers +seront stockés dans `req.files`. + +`fields` doit être un tableau d'objets avec `name` et éventuellement un `maxCount`. +Exemple: + +```javascript +[ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 } +] +``` + +#### `.none()` + +N'acceptez que les champs de texte. Si un téléchargement de fichier est effectué, une erreur avec le code +"LIMIT\_UNEXPECTED\_FILE" sera émis. + +#### `.any()` + +Accepte tous les fichiers qui arrivent sur le fil. Un tableau de fichiers sera stocké dans +`req.files`. + +**ATTENTION:** Assurez-vous de toujours gérer les fichiers qu'un utilisateur télécharge. +N'ajoutez jamais multer en tant que middleware global car un utilisateur malveillant pourrait télécharger des +fichiers vers un itinéraire que vous n'aviez pas prévu. N'utilisez cette fonction que sur les itinéraires +où vous gérez les fichiers téléchargés. + +### `storage` + +#### `DiskStorage` + +Le moteur de stockage sur disque vous donne un contrôle total sur le stockage des fichiers sur le disque. + +```javascript +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) + cb(null, file.fieldname + '-' + uniqueSuffix) + } +}) + +const upload = multer({ storage: storage }) +``` + +Il y a deux options disponibles, `destination` et `filename`. Elles sont toutes les deux +des fonctions qui déterminent où le fichier doit être stocké. + +`destination` est utilisé pour déterminer dans quel dossier les fichiers téléchargés doivent +être stocké. Cela peut également être donné sous forme de `string` (par exemple `'/tmp/uploads'`). Sinon +`destination` est donné, le répertoire par défaut du système d'exploitation est utilisé pour les +fichiers temporaires. + +**Remarque:** Vous êtes responsable de la création du répertoire lorsque vous fournissez +`destination` en tant que fonction. Lors du passage d'une chaîne, multer s'assurera que +le répertoire est créé pour vous. + +`filename` est utilisé pour déterminer le nom du fichier dans le dossier. +Si aucun "nom de fichier" n'est donné, chaque fichier recevra un nom aléatoire qui n'inclut +pas d'extension de fichier. + +**Remarque:** Multer n'ajoutera aucune extension de fichier pour vous, votre fonction +doit renvoyer un nom de fichier complet avec une extension de fichier. + +Chaque fonction reçoit à la fois la requête (`req`) et des informations sur +le dossier (`file`) pour aider à la décision. + +Notez que `req.body` n'a peut-être pas encore été entièrement rempli. Cela dépend de l'ordre +où le client transmet les champs et les fichiers au serveur. + +Pour comprendre la convention d'appel utilisée dans le rappel (nécessité de passer +null comme premier paramètre), reportez-vous à +[Node.js error handling](https://web.archive.org/web/20220417042018/https://www.joyent.com/node-js/production/design/errors) + +#### `MemoryStorage` + +Le moteur de stockage en mémoire stocke les fichiers en mémoire en tant qu'objets `Buffer`. Il +n'a pas d'options. + +```javascript +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) +``` + +Lors de l'utilisation du stockage en mémoire, les informations sur le fichier contiendront un champ appelé +`buffer` qui contient le fichier entier. + +**ATTENTION**: Le téléchargement de fichiers très volumineux ou de fichiers relativement petits en grand +nombres très rapidement, peut entraîner un manque de mémoire de votre application lorsque +le stockage en mémoire est utilisé. + +### `limits` + +Un objet spécifiant les limites de taille des propriétés facultatives suivantes. Multer passe directement cet objet dans busboy, et les détails des propriétés peuvent être trouvés sur [la page de busboy](https://github.com/mscdex/busboy#busboy-methods). + +Les valeurs entières suivantes sont disponibles : + +Clé | Description | Default +--- |---------------------------------------------------------------------------| --- +`fieldNameSize` | Taille maximale du nom de champ | 100 bytes +`fieldSize` | Max field value size (in bytes) | 1MB +`fields` | Taille maximale de la valeur du champ (en octets) | Infinity +`fileSize` | Pour les formulaires multipart, la taille maximale du fichier (en octets) | Infinity +`files` | Pour les formulaires multipart, le nombre maximal de champs de fichier | Infinity +`parts` | Pour les formulaires multipart, le nombre max de parties (champs + fichiers) | Infinity +`headerPairs` | Pour les formulaires multipart, le nombre maximum de paires clé=>valeur d'en-tête à analyser | 2000 + +Spécifier les limites peut aider à protéger votre site contre les attaques par déni de service (DoS). + +### `fileFilter` + +Définissez ceci sur une fonction pour contrôler quels fichiers doivent être téléchargés et lesquels +devrait être ignoré. La fonction devrait ressembler à ceci: + +```javascript +function fileFilter (req, file, cb) { + + // La fonction doit appeler `cb` avec un booléen + // pour indiquer si le fichier doit être accepté + + // Pour rejeter ce fichier, passez `false`, comme ceci: + cb(null, false) + + // Pour accepter le fichier, passez `true`, comme ceci: + cb(null, true) + + // Vous pouvez toujours passer une erreur si quelque chose ne va pas: + cb(new Error('I don\'t have a clue!')) + +} +``` + +## Gestion des Erreurs + +En cas d'erreur, Multer déléguera l'erreur à Express. Vous pouvez +afficher une belle page d'erreur en utilisant [la voie express standard](http://expressjs.com/guide/error-handling.html). + +Si vous souhaitez détecter les erreurs spécifiquement de Multer, vous pouvez appeler la +fonction middleware par vous-même. Aussi, si vous voulez attraper seulement [les erreurs Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), vous pouvez utiliser la classe `MulterError` qui est jointe à l'objet `multer` lui-même (par exemple `err instanceof multer.MulterError`). + +```javascript +const multer = require('multer') +const upload = multer().single('avatar') + +app.post('/profile', function (req, res) { + upload(req, res, function (err) { + if (err instanceof multer.MulterError) { + // Une erreur Multer s'est produite lors du téléchargement. + } else if (err) { + // Une erreur inconnue s'est produite lors du téléchargement. + } + + // Tout s'est bien passé. + }) +}) +``` + +## Moteur de stockage personnalisé + +Pour plus d'informations sur la création de votre propre moteur de stockage, consultez [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## License + +[MIT](LICENSE) From 8cc3a5d548b50f4efa865534482cfe253d553f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 30 Jan 2023 16:21:11 +0700 Subject: [PATCH 064/103] Tweak indentation --- README.md | 12 ++++++------ doc/README-fr.md | 9 +++------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ea9ccdb5..8c4dc4d9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Don't forget the `enctype="multipart/form-data"` in your form. ```html
- +
``` @@ -84,11 +84,11 @@ Here's an example on how multer is used an HTML form. Take special note of the ` ```html
-
- - - -
+
+ + + +
``` diff --git a/doc/README-fr.md b/doc/README-fr.md index 53fc9d4a..3f3f2150 100644 --- a/doc/README-fr.md +++ b/doc/README-fr.md @@ -97,14 +97,11 @@ Ensuite, dans votre fichier javascript, vous ajouterez ces lignes pour accéder const multer = require('multer') const upload = multer({ dest: './public/data/uploads/' }) app.post('/stats', upload.single('uploaded_file'), function (req, res) { - // req.file est le nom de votre fichier dans le formulaire ci-dessus, ici 'uploaded_file' - // req.body contiendra les champs de texte, s'il y en avait - console.log(req.file, req.body) + // req.file est le nom de votre fichier dans le formulaire ci-dessus, ici 'uploaded_file' + // req.body contiendra les champs de texte, s'il y en avait + console.log(req.file, req.body) }); ``` - - - ## API ### Informations sur les fichiers From cbb4a80b0d71ad3a29f8fa2db82a5fb9de0e0951 Mon Sep 17 00:00:00 2001 From: Vitor Ribeiro <72838474+vitorRibeiro7@users.noreply.github.com> Date: Tue, 25 Apr 2023 10:38:31 -0300 Subject: [PATCH 065/103] Update README-pt-br.md --- doc/README-pt-br.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index 5fa2e7ee..d066ddd0 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -1,6 +1,6 @@ # Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) -Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. Está escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. +Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. **NOTA**: Multer não processará nenhum formulário que não seja multipart (`multipart/form-data`). @@ -26,7 +26,7 @@ Multer adiciona um objeto `body` e um `file` ou objeto `files` para objeto `requ Exemplo de uso básico: -Não esqueça o `enctype="multipart/form-data"` em seu formulário. +Não esqueça o `enctype='multipart/form-data'` em seu formulário. ```html
@@ -36,30 +36,30 @@ Não esqueça o `enctype="multipart/form-data"` em seu formulário. ```javascript const express = require('express') -const multer = require('multer') +const multer = require('multer') const upload = multer({ dest: 'uploads/' }) const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { - // req.file is the `avatar` file - // req.body will hold the text fields, if there were any + // req.file é um arquivo `avatar` + // req.body conterá os campos de texto, se houver }) app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { - // req.files is array of `photos` files - // req.body will contain the text fields, if there were any + // req.files é um array de arquivos `photos` + // req.body conterá os campos de texto, se houver }) const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) app.post('/cool-profile', cpUpload, function (req, res, next) { - // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files + // req.files é um objeto (String -> Array) onde fieldname é a chave e o valor é array de arquivos // // e.g. - // req.files['avatar'][0] -> File + // req.files['avatar'][0] -> Arquivo // req.files['gallery'] -> Array // - // req.body will contain the text fields, if there were any + // req.body conterá os campos de texto, se houver }) ``` @@ -72,7 +72,7 @@ const multer = require('multer') const upload = multer() app.post('/profile', upload.none(), function (req, res, next) { - // req.body contains the text fields + // req.body contém os campos de texto }) ``` @@ -100,7 +100,7 @@ Multer aceita um objeto de opções, a propriedade mais básica é o `dest`, que Por padrão, Multer irá renomear os arquivos para evitar conflitos de nomes. A função de renomeação pode ser personalizada de acordo com suas necessidades. -A seguir estão as opções que podem ser passadas para Multer. +A seguir estão as opções que podem ser passadas para o Multer. Key | Descrição --- | --- @@ -123,7 +123,7 @@ Aceite um único arquivo com o nome `fieldname`. O arquivo único será armazena #### `.array(fieldname[, maxCount])` -Aceite múltiplos arquivos, todos com o nome `fieldname`. Opcional, gera um erro se mais de `maxCount` forem enviados. O array de arquivos serão armazenados em +Aceite múltiplos arquivos, todos com o nome `fieldname`. Opcional, gera um errose forem enviados mais de `maxCount`. O array de arquivos serão armazenados em `req.files`. #### `.fields(fields)` @@ -147,7 +147,7 @@ Aceite apenas campo de texto. Se algum upload de arquivo for feito, um erro com #### `.any()` -Aceita todos os arquivos que são enviaos. Uma matriz de arquivos será armazenada em +Aceita todos os arquivos que são enviados. Uma matriz de arquivos será armazenada em `req.files`. **AVISO:** Certifique-se de sempre manipular os arquivos que um usuário envia. @@ -226,7 +226,7 @@ A função deve ficar assim: function fileFilter (req, file, cb) { // A função deve chamar `cb` com um booleano - // to indicate if the file should be accepted + // para indicar se o arquivo deve ser aceito // Para rejeitar este arquivo passe `false`, assim: cb(null, false) @@ -253,12 +253,12 @@ const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { if (err instanceof multer.MulterError) { - // A Multer error occurred when uploading. + // Ocorreu um erro Multer durante o upload. } else if (err) { - // An unknown error occurred when uploading. + // Ocorreu um erro Multer durante o upload. } - // Everything went fine. + // Tudo correu bem. }) }) ``` From 4da126f3fb9e3af76765013a3323d3c63a41e9dd Mon Sep 17 00:00:00 2001 From: Vitor Ribeiro <72838474+vitorRibeiro7@users.noreply.github.com> Date: Tue, 25 Apr 2023 10:40:23 -0300 Subject: [PATCH 066/103] Update README-pt-br.md --- doc/README-pt-br.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index d066ddd0..ff0d18c5 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -1,6 +1,6 @@ # Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) -Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. +Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. Foi escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. **NOTA**: Multer não processará nenhum formulário que não seja multipart (`multipart/form-data`). From 274550c2b366a26888bc4ca1c36fee76bfc51cfd Mon Sep 17 00:00:00 2001 From: Vitor Ribeiro <72838474+vitorRibeiro7@users.noreply.github.com> Date: Wed, 26 Apr 2023 07:51:46 -0300 Subject: [PATCH 067/103] Update README-pt-br.md --- doc/README-pt-br.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index ff0d18c5..e36a1f4f 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -253,9 +253,9 @@ const upload = multer().single('avatar') app.post('/profile', function (req, res) { upload(req, res, function (err) { if (err instanceof multer.MulterError) { - // Ocorreu um erro Multer durante o upload. + // Ocorreu um erro durante o upload. } else if (err) { - // Ocorreu um erro Multer durante o upload. + // Ocorreu um erro durante o upload. } // Tudo correu bem. From f1596eb8bb18ede3b1fe61582f496ddb6880115e Mon Sep 17 00:00:00 2001 From: Vitor Ribeiro <72838474+vitorRibeiro7@users.noreply.github.com> Date: Wed, 26 Apr 2023 12:09:20 -0300 Subject: [PATCH 068/103] Update README-pt-br.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Linus Unnebäck --- doc/README-pt-br.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index e36a1f4f..ad3bebfb 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -56,7 +56,7 @@ app.post('/cool-profile', cpUpload, function (req, res, next) { // req.files é um objeto (String -> Array) onde fieldname é a chave e o valor é array de arquivos // // e.g. - // req.files['avatar'][0] -> Arquivo + // req.files['avatar'][0] -> File // req.files['gallery'] -> Array // // req.body conterá os campos de texto, se houver From 842088f54e010e94e6ff393515f5981522f83d1d Mon Sep 17 00:00:00 2001 From: Vitor Ribeiro <72838474+vitorRibeiro7@users.noreply.github.com> Date: Wed, 26 Apr 2023 12:09:33 -0300 Subject: [PATCH 069/103] Update README-pt-br.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Linus Unnebäck --- doc/README-pt-br.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index ad3bebfb..996049b5 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -26,7 +26,7 @@ Multer adiciona um objeto `body` e um `file` ou objeto `files` para objeto `requ Exemplo de uso básico: -Não esqueça o `enctype='multipart/form-data'` em seu formulário. +Não esqueça o `enctype="multipart/form-data"` em seu formulário. ```html From 78a7535ce3cd535efd6aede28fecc552c5ccc3c9 Mon Sep 17 00:00:00 2001 From: eugene Date: Thu, 28 Sep 2023 16:19:40 +0500 Subject: [PATCH 070/103] doc: uzbek language --- doc/README-uz.md | 273 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 doc/README-uz.md diff --git a/doc/README-uz.md b/doc/README-uz.md new file mode 100644 index 00000000..80132fa7 --- /dev/null +++ b/doc/README-uz.md @@ -0,0 +1,273 @@ +# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) + +Multer - bu nodejs middleware bo'lib, asosan `multipart/form-data` shaklda yuborilgan fayllarni yuklashda ishlatiladi. Yuqori samaradorlikka erishish uchun [busboy](https://github.com/mscdex/busboy)ning ustiga yozilgan. + +**Muhim**: Multer `multipart` bo'lmagan har qanday formani qayta ishlamaydi. + +## Tarjimalar + +Bu README boshqa tillarda ham mavjud: + +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (arabcha) +- [English](https://github.com/expressjs/multer/blob/master/README.md) (inglizcha) +- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (ispancha) +- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (xitoycha) +- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (korescha) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (portugalcha) +- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (ruscha) +- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (fransuzcha) + + +## O'rnatish + +```sh +$ npm install --save multer +``` + +## Foydalanish + +Multer - `request` ob'ektiga `body` va `file` yoki `files` ob'ektini qo'shadi. `body` ob'ekti formaning matn maydonlarining (fields) qiymatlarini o'z ichiga oladi, `file` yoki `files` ob'ekti forma orqali yuklangan fayllarni o'z ichiga oladi. + +Sodda ishlatish uchun namuna: + +Formada `enctype="multipart/form-data"` qo'shish esdan chiqmasin + +```html + + + +``` + +```javascript +const express = require('express') +const multer = require('multer') +const upload = multer({ dest: 'uploads/' }) + +const app = express() + +app.post('/profile', upload.single('avatar'), function (req, res, next) { + // req.file - fayl `avatar` + // req.body agar matnli maydonlar (fields) bo'lsa, ularni saqlanadi +}) + +app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { + // req.files - fayllar massivi `photos` + // req.body agar matnli maydonlar (fields) bo'lsa, ularni saqlanadi +}) + +const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', cpUpload, function (req, res, next) { + // req.files - bu ob'ekt (String -> Array), matn maydoni(fieldname) - bu key, va qiymat - fayllar massivi + // + // misol: + // req.files['avatar'][0] -> File + // req.files['gallery'] -> Array + // + // req.body agar matnli maydonlar (fields) bo'lsa, ularni saqlanadi +}) +``` + +Agarda siz faqat matndan iborat multipart form bilan ishlashingiz kerak bo'lsa, `.none()` ishlating: + +```javascript +const express = require('express') +const app = express() +const multer = require('multer') +const upload = multer() + +app.post('/profile', upload.none(), function (req, res, next) { + // req.body matnli maydonlar (fields)ni o'zida saqlaydi +}) +``` + +## API + +### Fayl haqida ma'lumot + +Har bir fayl quyidagi ma'lumotlarni o'zida saqlaydi: + +Kalit(key) | Ta'rif | Eslatma +--- |----------------------------------------| --- +`fieldname` | Formada berilgan maxsus nom | +`originalname` | Foydalanuvchi kompyuteridagi fayl nomi | +`encoding` | Faylning kodlash turi | +`mimetype` | Faylning `mime` turi | +`size` | Fayl hajmi - baytda | +`destination` | Fayl saqlangan papka | `DiskStorage` +`filename` | `destination`ni ichidagi fayl nomi | `DiskStorage` +`path` | Yuklangan faylning to'liq yo'li | `DiskStorage` +`buffer` | Butun boshli fayl `Buffer` tipda | `MemoryStorage` + +### `multer(opts)` + +Multer qo'shimcha ob'ekt qabul qiladi, ulardan eng asosiysi - `dest`, +Multerga fayllarni qayerga yuklash kerakligini aytadigan xususiyat. Agarda siz qo'shimcha(`options`) ob'ektni tashlab ketsangiz, fayllar xotirada saqlanadi va hech qachon diskka yozilmaydi. + +Standart holatda - Multer nomlashda kelib chiqishi mumkin bo'lgan muammolarni oldini olish uchun fayllar nomini o'zgartiradi. O'z talablaringizga mos ravishda nomlash funksiyasini sozlay olashingiz mumkin. + +Quyidagilar Multerga qo'shimcha qiymat sifati berilishi mumkin: + +Kalit(key) | Ta'rif +--- | --- +`dest` yoki `storage` | Faylni qayerda saqlash +`fileFilter` | Qaysi fayllar qabul qilinishini boshqarish funksiyasi +`limits` | Yuklash chegarasi +`preservePath` | Asosiy nom o'rniga fayllarning to'liq yo'lini saqlash + +O'rtacha veb-ilovada faqat `dest` kerak bo'lishi mumkin va quyidagicha sozlanishi mumkin + +```javascript +const upload = multer({ dest: 'uploads/' }) +``` +Yuklamalaringizni boshqarishda ko'proq nazoratni xohlasangiz, `dest` o'rniga `storage` tanlovini ishlatishingiz kerak. Multer `DiskStorage` va `MemoryStorage` saqlash motorlari(engines) bilan keladi. Boshqa motorlar(engines) uchun uchinchi tomondan(third parties) ko'proq tanlovlar keladi. + +#### `.single(fieldname)` + +`fieldname` nomi bilan yagona faylni qabul qiladi. Yagona fayl `req.file` da saqlanadi. + +#### `.array(fieldname[, maxCount])` + +`fieldname` nomi bilan fayllar massivini qabul qiladi. Agar `maxCount` dan ko'p fayl yuklash urinishi bo'lsa, hatolikni aniqlash imkoniyatini berish mumkin. Fayllar massivi `req.files` da saqlanadi. + +#### `.fields(fields)` + +`fields`da aniqlangan fayllarni qabul qiladi. Fayllar massivini saqlash uchun `req.files` ichidagi massivda saqlanadi. + +`fields` ob'ektida `name` va `maxCount` kalitlar(keys)ni o'z ichiga olishi kerak. Misol: + +```javascript +[ + { name: 'avatar', maxCount: 1 }, + { name: 'gallery', maxCount: 8 } +] +``` + +#### `.none()` + +Faqatgina matnli maydonlar(fields)ni oladi. Agarda biror fayl yuklansa, "LIMIT\_UNEXPECTED\_FILE" xatoligi yuboriladi. + +#### `.any()` + +Ushbu so'rov barcha fayllarni qabul qiladi, fayllar `req.files` ichida saqlanadi. + +**OGOHLANTIRISH:** Foydalanuvchi yuklagan fayllarni doimo boshqarib turishni unutmang. Ularni boshqa yo'l(route)ni kutmagan holda fayllarini yuklash imkonini beradigan global middleware sifatida multerni sozlamang. Faqatgina yuklangan fayllarni boshqarish kerak bo'lgan yo'l(route)larda ushbu funksiyani ishlating. + +### `storage` + +#### `DiskStorage` + +Diskka saqlash motori(engine) sizga fayllarni saqlashda to'liq nazorat qilish imkonini beradi. + +```javascript +const storage = multer.diskStorage({ + destination: function (req, file, cb) { + cb(null, '/tmp/my-uploads') + }, + filename: function (req, file, cb) { + cb(null, file.fieldname + '-' + Date.now()) + } +}) + +const upload = multer({ storage: storage }) +``` + +`destination` va `filename` qo'shimcha tanlovlari mavjud, ular ikkala ham qaysi papkada faylni saqlash kerakligini aniqlab turadigan funksiyalardir. + +`destination` yuklangan fayllarni qaysi papkada saqlash kerakligini aniqlab turadi. Bu, `string` sifatida berilishi mumkin (masalan, `'/tmp/uploads'`). Agar `destination` berilmagan bo'lsa, operatsion tizimning vaqtinchalik fayllar uchun ishlatiladigan papkasini ishlatadi. + +**Diqqat:** `destination` ni funksiya sifatida berib bo'lganda papka ochilganligiga o'zingiz javobgar bo'lasiz. Agar `string` sifatida bersangiz, multer papkani o'zi uchun yaratishni ta'minlaydi. + +`filename` faylni papka ichida qanday nomlanganligini aniqlaydi. Agar `filename` berilmagan bo'lsa, har bir faylga fayl kengaytmasini o'z ichiga olmagan tasodifiy nom beriladi. + +**Diqqat:** Multer siz uchun fayl kengaytmasini qo'shmaydi, sizning funksiyangiz kengaytma bilan to'liq nomni qaytarishi kerak. + +Har bir funksiya `req` so'rovini va fayl haqida ma'lumotlarni (`file`) olish uchun o'tkaziladi. + +Diqqat qiling, `req.body` hali to'liq to'ldirilmagan bo'lishi mumkin. Bu mijozning maydon(field)larni va fayllarni serverga qanday yuborishiga bog'liq bo'ladi. + +Callback funktsiyasida ishlatiladigan chaqirish tartibini tushunish uchun (birinchi parametr sifatida null o‘tkazish talab etilishi) ko‘rish uchun quyidagi manzilga murojaat qiling: +[Node.js da xatoliklarni ushlash](https://web.archive.org/web/20220417042018/https://www.joyent.com/node-js/production/design/errors) + +#### `MemoryStorage` + +Xotira saqlash motori fayllarni xotirada `Buffer` ob'ektlar sifatida saqlaydi. Uning qo'shimcha qiymatlari yo‘q. + +```javascript +const storage = multer.memoryStorage() +const upload = multer({ storage: storage }) +``` +Xotirada saqlash paytida, fayl ma'lumotlari `buffer` deb nomlanadigan maydonni o‘z ichiga oladi. + +**DIQQAT:** Juda katta fayllarni yuklash, yoki kichik fayllarni tez-tez yuklash, xotirada saqlash ishlatilganda, sizning ilovangizning xotirasini to'ldirib qo'yishi mumkin. + +### `limits` + +Quyidagi xususiyatlar o'lchov(limit)larni aniqlaydigan obyekt. Multer ushbu obyektni to'g'ridan-to'g'ri busboy ga o'tkazadi va xususiyatlar tafsilotlari [busboy sahifasida](https://github.com/mscdex/busboy#busboy-methods)dan topishingiz mumkin. + +Quyidagi butun qiymatlar mavjud: + +Kalit(key) | Ta'rif | Odatiy qiymat +--- |---------------------------------------------------------------------------------------------| --- +`fieldNameSize` | Maksimal maydon nomi o'lchami | 100 bayt +`fieldSize` | Maksimal maydon qiymati o'lchami (baytlarda) | 1MB +`fields` | Fayl bo'lmagan maydonlarning maksimal soni | Cheklanmagan +`fileSize` | Multipart form uchun faylning maksimal o'lchami (baytda) | Cheklanmagan +`files` | Multipart form uchun fayllar sonining maksimal chegarasi | Cheklanmagan +`parts` | Multipart form uchun fayllar sonining maksimal chegarasi (fieldlar va fayllar) | Cheklanmagan +`headerPairs` | Multipart form uchun ma'lumotlar (kalit va qiymat juftliklari) sonining maksimal chegarasi | 2000 + +Chegaralarni sozlash, DoS-hujumlariga qarshi saytingizni himoya qilishga yordam bera olishi mumkin + +### `fileFilter` + +Bu, qaysi fayllarni yuklashi, qaysilarini o'tkazib yuborish kerakligini boshqarish uchun funksiya sifatida sozlasa bo'ladi. Funksiya quyidagi ko'rinishda bo'lishi kerak:" + +```javascript +function fileFilter (req, file, cb) { + + // Bu funksiya, faylni qabul qilish kerakligini anglatish uchun `cb` ni + // boolean qiymat bilan chaqirish kerak. + + // Faylni qabul qilishni rad etish uchun false quyudagicha berilishi kerak: + cb(null, false) + + // Faylni qabul qiilishni tasdiqlash uchun true quyudagicha berilishi kerak: + cb(null, true) + + // Nimadir xato ketsa, siz har doim Error berishingiz mumkin: + cb(new Error('I don\'t have a clue!')) + +} +``` + +## Xatolar bilan ishlash + +Xatoga duch kelganda, Multer xatoni Expressga yuboradi. [standart express usuli](http://expressjs.com/guide/error-handling.html)dan foydalanib xatoni tartibliroq chiqarishingiz mumkin. + +Agar siz Multerdan chiqqan xatolarni aniqlamoqchi bo'lsangiz o'zingiz `middleware` funksiya yozishingiz mumkin. Shuningdek, agar siz faqat [Multer xatolarini](https://github.com/expressjs/multer/blob/master/lib/multer-error.js) ushlamoqchi bo'lsangiz, siz `multer` ob'ektiga yozilgan `MulterError` class ni ishlatishingiz mumkin (masalan, `err instanceof multer.MulterError`). + + +```javascript +const multer = require('multer') +const upload = multer().single('avatar') + +app.post('/profile', function (req, res) { + upload(req, res, function (err) { + if (err instanceof multer.MulterError) { + // Yuklanishda Multerdan xatolik yuz berganda. + } else { + // Yuklanishda noma'lum xatolik yuz berganda. + } + + // Hammasi muvaffaqqiyatli bo'lganda. + }) +}) +``` + +## Maxsus saqlash mexanizmi + +O'zingizning saqlash dvigatelingizni qanday yaratish haqida ma'lumot olish: [Maxsus saqlash mexanizmi](https://github.com/expressjs/multer/blob/master/StorageEngine.md). + +## Litsenziya + +[MIT](LICENSE) From 2c01eb61d51e93cd9128e3398c451906c23278f6 Mon Sep 17 00:00:00 2001 From: eugene Date: Fri, 29 Sep 2023 08:18:45 +0500 Subject: [PATCH 071/103] doc: uzb lang added --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8c4dc4d9..f84d265f 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ This README is also available in other languages: - [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnam) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portuguese Brazil) - [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (French) +- [Uzbek](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbek) ## Installation From be3d4de267147065a8d66f3c4a9e4a2aef1b4207 Mon Sep 17 00:00:00 2001 From: eugene Date: Fri, 29 Sep 2023 08:20:19 +0500 Subject: [PATCH 072/103] doc: fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f84d265f..fc5702a3 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This README is also available in other languages: - [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnam) - [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portuguese Brazil) - [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (French) -- [Uzbek](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbek) +- [O'zbek tili](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbek) ## Installation From 2a4ff0392e4e6b6867130de6ba2bf0fbda6df7d1 Mon Sep 17 00:00:00 2001 From: Igor Caldeira Andrade <122459409+Igor-CA@users.noreply.github.com> Date: Sat, 13 Apr 2024 10:16:19 -0300 Subject: [PATCH 073/103] docs: replace link (#1251) - PR-URL: https://github.com/expressjs/multer/pull/1251 - Fix a issue with pt-br readme - English link was linking to russian documentation --- doc/README-pt-br.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index 996049b5..baf45033 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -8,7 +8,7 @@ Multer é um middleware node.js para manipulação `multipart/form-data`, que é Este README também está disponível em outros idiomas: -- [English](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Inglês) +- [English](https://github.com/expressjs/multer/blob/master/README.md) (Inglês) - [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espanhol) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinês) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) From 67409df7ea0e9c95e2acf000b47bd25f4b2f459a Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Mon, 15 Apr 2024 07:26:34 -0300 Subject: [PATCH 074/103] docs: update texts in pt-br and remove duplicated references in ko (#1252) PR-URL: https://github.com/expressjs/multer/pull/1252 --- doc/README-ko.md | 1 - doc/README-pt-br.md | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/doc/README-ko.md b/doc/README-ko.md index 897ba529..90ef53a8 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -9,7 +9,6 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 이 문서는 아래의 언어로도 제공됩니다: - [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (아라비아 말) -- [English](https://github.com/expressjs/multer/blob/master/README.md) - [English](https://github.com/expressjs/multer/blob/master/README.md) (영어) - [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index baf45033..f97306c1 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -9,10 +9,15 @@ Multer é um middleware node.js para manipulação `multipart/form-data`, que é Este README também está disponível em outros idiomas: - [English](https://github.com/expressjs/multer/blob/master/README.md) (Inglês) +- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Árabe) - [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espanhol) - [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinês) - [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) - [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russo) +- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnã) +- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brasil) +- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (Francês) +- [O'zbek tili](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbequistão) ## Instalação @@ -76,6 +81,30 @@ app.post('/profile', upload.none(), function (req, res, next) { }) ``` +Aqui está um exemplo de como o multer é usado em um formulário HTML. Onde adicionamos `enctype="multipart/form-data"` no form e no input `name="uploaded_file"`: + +```html +
+
+ + + +
+
+``` + +Então, em seu arquivo javascript, você adicionaria essas linhas para acessar o arquivo e o corpo. É importante que você use o valor do campo `name` do formulário em sua função de upload. Isso informa ao multer em qual campo da solicitação ele deve procurar os arquivos. Se esses campos não forem iguais no formulário HTML e no seu servidor, seu upload falhará: + +```javascript +const multer = require('multer') +const upload = multer({ dest: './public/data/uploads/' }) +app.post('/stats', upload.single('uploaded_file'), function (req, res) { + // req.fileé o nome do seu arquivo no formato acima, aqui 'uploaded_file' + // req.body irá conter os campos de texto, se houver algum + console.log(req.file, req.body) +}); +``` + ## API ### Informação de arquivo @@ -187,6 +216,10 @@ Cada função é passada pelo request (`req`) e algumas informações sobre o ar Observe que `req.body` pode não ter sido totalmente preenchido ainda. Isso depende da ordem na qual o cliente transmite campos e arquivos para o servidor. +Para entender a convenção de chamada usada no callback (precisando passar +null como o primeiro parâmetro), consulte em +[Manipulação de erros no Node.js](https://web.archive.org/web/20220417042018/https://www.joyent.com/node-js/production/design/errors) + #### `MemoryStorage` O mecanismo de armazenamento na memória, armazena os arquivos na memória como um objeto `Buffer`. Não tendo opções. From cd4cd41f6e6668621c36b970c3eaffcfe08bccbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Marqu=C3=ADnez=20Prado?= <25435858+inigomarquinez@users.noreply.github.com> Date: Tue, 14 May 2024 18:19:47 +0200 Subject: [PATCH 075/103] ci: add support for OSSF scorecard reporting (#1260) PR-URL: https://github.com/expressjs/multer/pull/1260 --- .github/workflows/scorecard.yml | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 .github/workflows/scorecard.yml diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 00000000..0e064f47 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,73 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security + +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '16 21 * * 1' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + # Uncomment the permissions below if installing in a private repository. + # contents: read + # actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecard on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@2f93e4319b2f04a2efc38fa7f78bd681bc3f7b2f # v2.23.2 + with: + sarif_file: results.sarif From c28306189a5ded5ff0c9b8044060d5cd4a2f1090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Marqu=C3=ADnez=20Prado?= <25435858+inigomarquinez@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:17:16 +0200 Subject: [PATCH 076/103] ci: replace travis with github action (#1259) * ci: replace travis with github action * docs: replace travis badge by github action badge * chore: update dependencies and scripts * ci: add code coverage * ci: remove unused supertest * chore: update mkdirp as the version used was deprecated * ci: remove node 0.8 * chore: comment node v5, v7, v9 * chore: comment node v5, v7, v9 * chore: comment node v5, v7, v9 * chore: remove comments * test: add exit option to mocha and separate lint command * ci: include node 5,7 and 9 again * ci: revert include node 5,7 and 9 again * ci: remove node v5,7 and 9 * Update package.json Co-authored-by: Chris de Almeida * Delete package-lock.json --------- Co-authored-by: Chris de Almeida --- .github/workflows/ci.yml | 187 +++++++++++++++++++++++++++++++++++++++ .travis.yml | 9 -- README.md | 2 +- package.json | 10 ++- 4 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..d4f5cae7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,187 @@ +name: ci + +on: +- pull_request +- push + +jobs: + test: + runs-on: ubuntu-20.04 + strategy: + matrix: + name: + - Node.js 0.10 + - Node.js 0.12 + - io.js 1.x + - io.js 2.x + - io.js 3.x + - Node.js 4.x + - Node.js 6.x + - Node.js 8.x + - Node.js 10.x + - Node.js 11.x + - Node.js 12.x + - Node.js 13.x + - Node.js 14.x + - Node.js 15.x + - Node.js 16.x + - Node.js 17.x + - Node.js 18.x + - Node.js 19.x + - Node.js 20.x + - Node.js 21.x + - Node.js 22.x + + include: + - name: Node.js 0.10 + node-version: "0.10" + npm-i: mocha@3.5.3 nyc@10.3.2 + + - name: Node.js 0.12 + node-version: "0.12" + npm-i: mocha@3.5.3 nyc@10.3.2 + + - name: io.js 1.x + node-version: "1.8" + npm-i: mocha@3.5.3 nyc@10.3.2 + + - name: io.js 2.x + node-version: "2.5" + npm-i: mocha@3.5.3 nyc@10.3.2 + + - name: io.js 3.x + node-version: "3.3" + npm-i: mocha@3.5.3 nyc@10.3.2 + + - name: Node.js 4.x + node-version: "4.9" + npm-i: mocha@5.2.0 nyc@11.9.0 + + - name: Node.js 6.x + node-version: "6.17" + npm-i: mocha@6.2.2 nyc@14.1.1 + + - name: Node.js 8.x + node-version: "8.17" + npm-i: mocha@7.1.2 nyc@14.1.1 + + - name: Node.js 10.x + node-version: "10.24" + npm-i: mocha@8.4.0 + + - name: Node.js 11.x + node-version: "11.15" + npm-i: mocha@8.4.0 + + - name: Node.js 12.x + node-version: "12.22" + npm-i: mocha@9.2.2 + + - name: Node.js 13.x + node-version: "13.14" + npm-i: mocha@9.2.2 + + - name: Node.js 14.x + node-version: "14.21" + + - name: Node.js 15.x + node-version: "15.14" + + - name: Node.js 16.x + node-version: "16.20" + + - name: Node.js 17.x + node-version: "17.9" + + - name: Node.js 18.x + node-version: "18.18" + + - name: Node.js 19.x + node-version: "19.9" + + - name: Node.js 20.x + node-version: "20.9" + + - name: Node.js 21.x + node-version: "21.1" + + - name: Node.js 22.x + node-version: "22.0" + + steps: + - uses: actions/checkout@v4 + + - name: Install Node.js ${{ matrix.node-version }} + shell: bash -eo pipefail -l {0} + run: | + nvm install --default ${{ matrix.node-version }} + if [[ "${{ matrix.node-version }}" == 0.* && "$(cut -d. -f2 <<< "${{ matrix.node-version }}")" -lt 10 ]]; then + nvm install --alias=npm 0.10 + nvm use ${{ matrix.node-version }} + if [[ "$(npm -v)" == 1.1.* ]]; then + nvm exec npm npm install -g npm@1.1 + ln -fs "$(which npm)" "$(dirname "$(nvm which npm)")/npm" + else + sed -i '1s;^.*$;'"$(printf '#!%q' "$(nvm which npm)")"';' "$(readlink -f "$(which npm)")" + fi + npm config set strict-ssl false + fi + dirname "$(nvm which ${{ matrix.node-version }})" >> "$GITHUB_PATH" + + - name: Configure npm + run: | + if [[ "$(npm config get package-lock)" == "true" ]]; then + npm config set package-lock false + else + npm config set shrinkwrap false + fi + + - name: Remove npm module(s) ${{ matrix.npm-rm }} + run: npm rm --silent --save-dev ${{ matrix.npm-rm }} + if: matrix.npm-rm != '' + + - name: Install npm module(s) ${{ matrix.npm-i }} + run: npm install --save-dev ${{ matrix.npm-i }} + if: matrix.npm-i != '' + + - name: Install Node.js dependencies + run: npm install + + - name: List environment + id: list_env + shell: bash + run: | + echo "node@$(node -v)" + echo "npm@$(npm -v)" + npm -s ls ||: + (npm -s ls --depth=0 ||:) | awk -F'[ @]' 'NR>1 && $2 { print $2 "=" $3 }' >> "$GITHUB_OUTPUT" + + - name: Lint code + run: npm run lint + + - name: Run tests + shell: bash + run: | + if npm -ps ls nyc | grep -q nyc; then + npm run test-ci + else + npm test + fi + + - name: Collect code coverage + uses: coverallsapp/github-action@master + if: steps.list_env.outputs.nyc != '' + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + flag-name: run-${{ matrix.test_number }} + parallel: true + + coverage: + needs: test + runs-on: ubuntu-latest + steps: + - name: Upload code coverage + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + parallel-finished: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 343dd5a1..00000000 --- a/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -sudo: false -language: node_js -node_js: - - "0.10" - - "0.12" - - "4" - - "6" - - "8" - - "10" diff --git a/README.md b/README.md index fc5702a3..677bc937 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. diff --git a/package.json b/package.json index 6aec9996..fa669581 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "append-field": "^1.0.0", "busboy": "^0.2.11", "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", "on-finished": "^2.3.0", "type-is": "^1.6.4", @@ -33,7 +33,8 @@ "express": "^4.13.1", "form-data": "^1.0.0-rc1", "fs-temp": "^1.1.2", - "mocha": "^3.5.3", + "mocha": "^10.4.0", + "nyc": "^15.1.0", "rimraf": "^2.4.1", "standard": "^14.3.3", "testdata-w3c-json-form": "^1.0.0" @@ -48,6 +49,9 @@ "lib/" ], "scripts": { - "test": "standard && mocha" + "lint": "standard", + "test": "standard && mocha --reporter spec --bail --exit --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" } } From 37241f8a556be041520305df9b29c9c5d5ce7ccf Mon Sep 17 00:00:00 2001 From: Max Mathieu Date: Sat, 21 Sep 2024 17:31:27 -0400 Subject: [PATCH 077/103] Fix out-of-band error event from busboy --- lib/make-middleware.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index 6627cf4c..cc26414a 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -41,7 +41,9 @@ function makeMiddleware (setup) { if (isDone) return isDone = true req.unpipe(busboy) - busboy.removeAllListeners() + process.nextTick(() => { + busboy.removeAllListeners() + }) next(err) } From 2405995e2eef0a62c6d5c84660fafa1a213bfcea Mon Sep 17 00:00:00 2001 From: Sreejit Date: Fri, 20 Dec 2024 23:15:07 +0530 Subject: [PATCH 078/103] docs: improve readability (#1255) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 677bc937..a52a9aab 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ app.post('/profile', upload.none(), function (req, res, next) { }) ``` -Here's an example on how multer is used an HTML form. Take special note of the `enctype="multipart/form-data"` and `name="uploaded_file"` fields: +Here's an example on how multer is used in a HTML form. Take special note of the `enctype="multipart/form-data"` and `name="uploaded_file"` fields: ```html
From 4ce82b0e35e407df1f8758159e2577c9f31ecaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Thu, 20 Mar 2025 11:47:24 +0100 Subject: [PATCH 079/103] test: add test for out-of-band error event --- test/express-integration.js | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/express-integration.js b/test/express-integration.js index 0cda05d4..74ebfed4 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ var assert = require('assert') +var http = require('http') var multer = require('../') var util = require('./_util') @@ -105,4 +106,48 @@ describe('Express Integration', function () { done() }) }) + + it('should not crash on malformed request', function (done) { + var upload = multer() + + app.post('/upload', upload.single('file'), function (req, res) { + res.status(500).end('Request should not be processed') + }) + + app.use(function (err, req, res, next) { + assert.strictEqual(err.message, 'Unexpected end of form') + res.status(200).end('Correct error') + }) + + var boundary = 'AaB03x' + var body = [ + '--' + boundary, + 'Content-Disposition: form-data; name="file"; filename="test.txt"', + 'Content-Type: text/plain', + '', + 'test without end boundary' + ].join('\r\n') + var options = { + hostname: 'localhost', + port, + path: '/upload', + method: 'POST', + headers: { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + } + + var req = http.request(options, (res) => { + assert.strictEqual(res.statusCode, 200) + done() + }) + + req.on('error', (err) => { + done(err) + }) + + req.write(body) + req.end() + }) }) From 502c03dcaa22084c030f2a843da207aab6155a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Thu, 20 Mar 2025 11:48:43 +0100 Subject: [PATCH 080/103] history: 1.4.5-lts.2 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aeb328f..cf62190a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 1.4.5-lts.2 + +- Fix out-of-band error event from busboy (#1177) + ## 1.4.5-lts.1 - No changes + ## 1.4.4-lts.1 - Bugfix: Bump busboy to fix CVE-2022-24434 (#1097) From 8ec534f23ce8856b51ab0e0020ef427d0c92289a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Thu, 20 Mar 2025 11:48:53 +0100 Subject: [PATCH 081/103] version: 1.4.5-lts.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8545a73d..32507d88 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.5-lts.1", + "version": "1.4.5-lts.2", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From d0782a5cad774bf6296c9fe9be16bb56081c600b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Thu, 20 Mar 2025 11:47:24 +0100 Subject: [PATCH 082/103] test: add test for out-of-band error event --- test/express-integration.js | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/express-integration.js b/test/express-integration.js index 87ab8869..0c6acd1c 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -1,6 +1,7 @@ /* eslint-env mocha */ var assert = require('assert') +var http = require('http') var multer = require('../') var util = require('./_util') @@ -106,4 +107,48 @@ describe('Express Integration', function () { done() }) }) + + it('should not crash on malformed request', function (done) { + var upload = multer() + + app.post('/upload', upload.single('file'), function (req, res) { + res.status(500).end('Request should not be processed') + }) + + app.use(function (err, req, res, next) { + assert.strictEqual(err.message, 'Unexpected end of multipart data') + res.status(200).end('Correct error') + }) + + var boundary = 'AaB03x' + var body = [ + '--' + boundary, + 'Content-Disposition: form-data; name="file"; filename="test.txt"', + 'Content-Type: text/plain', + '', + 'test without end boundary' + ].join('\r\n') + var options = { + hostname: 'localhost', + port: port, + path: '/upload', + method: 'POST', + headers: { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + } + + var req = http.request(options, function (res) { + assert.strictEqual(res.statusCode, 200) + done() + }) + + req.on('error', function (err) { + done(err) + }) + + req.write(body) + req.end() + }) }) From 900764f2c06d45df33a0a431e5a3e9765d8af23b Mon Sep 17 00:00:00 2001 From: Carlos Serrano Date: Thu, 17 Apr 2025 16:17:23 +0200 Subject: [PATCH 083/103] chore: upgrade scorecard workflow pinned action versions (#1290) --- .github/workflows/scorecard.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 0e064f47..66393ed2 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -33,12 +33,12 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 with: results_file: results.sarif results_format: sarif @@ -60,7 +60,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: SARIF file path: results.sarif @@ -68,6 +68,7 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@2f93e4319b2f04a2efc38fa7f78bd681bc3f7b2f # v2.23.2 + uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: results.sarif + \ No newline at end of file From 88f2aa1a900113b1d6fb6f81dfd92d630bc67f95 Mon Sep 17 00:00:00 2001 From: Maddy Guthridge Date: Thu, 8 May 2025 02:18:00 +1000 Subject: [PATCH 084/103] docs: remove unfortunate abbreviation from readme (#1299) Fixes #1298 --- README.md | 6 +++--- doc/README-ar.md | 24 ++++++++++++------------ doc/README-es.md | 6 +++--- doc/README-fr.md | 10 +++++----- doc/README-ko.md | 4 ++-- doc/README-pt-br.md | 8 ++++---- doc/README-ru.md | 20 ++++++++++---------- doc/README-uz.md | 14 +++++++------- doc/README-vi.md | 4 ++-- doc/README-zh-cn.md | 4 ++-- 10 files changed, 50 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index a52a9aab..3b1975bb 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body will contain the text fields, if there were any }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files // // e.g. @@ -100,7 +100,7 @@ const multer = require('multer') const upload = multer({ dest: './public/data/uploads/' }) app.post('/stats', upload.single('uploaded_file'), function (req, res) { // req.file is the name of your file in the form above, here 'uploaded_file' - // req.body will hold the text fields, if there were any + // req.body will hold the text fields, if there were any console.log(req.file, req.body) }); ``` diff --git a/doc/README-ar.md b/doc/README-ar.md index 5497865f..8a6d681b 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -7,7 +7,7 @@ **ملاحظة**: لن يقوم Multer بمعالجة أي شكل غير متعدد الأجزاء (`multipart/form-data`). -## الترجمات +## الترجمات هذا الملف متاح أيضًا بلغات أخرى: @@ -63,8 +63,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body will contain the text fields, if there were any }) -var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +var uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files // // e.g. @@ -101,18 +101,18 @@ app.post('/profile', upload.none(), function (req, res, next) { مفتاح | وصف | ملاحظة --- | --- | --- -`fieldname` | اسم المُدخَل المحدد في الإستمارة | -`originalname` | اسم الملف على كمبيوتر المستخدم | -`encoding` | نوع تشفير الملف | -`mimetype` | نوع ملف ملحقات بريد إنترنت متعددة الأغراض ( MIME ) | -`size` | حجم الملف بالبايت | +`fieldname` | اسم المُدخَل المحدد في الإستمارة | +`originalname` | اسم الملف على كمبيوتر المستخدم | +`encoding` | نوع تشفير الملف | +`mimetype` | نوع ملف ملحقات بريد إنترنت متعددة الأغراض ( MIME ) | +`size` | حجم الملف بالبايت | `destination` | المجلد الذي تم حفظ الملف إليه | `تخزين على الاسطوانة` (`DiskStorage`) `filename` | اسم الملف داخل "الوجهة" ( `destination` ) | `تخزين على الاسطوانة` (`DiskStorage`) `path` | المسار الكامل للملف الذي تم تحميله | `تخزين على الاسطوانة` (`DiskStorage`) `buffer` | "ذاكرة" (`Buffer`) للملف بأكمله | `تخزين على الذاكرة ` (`MemoryStorage`) -### `multer(opts)` +### `multer(opts)` يقبل Multer كائن الخيارات ، وأهمها خاصية `dest`، والتي تحدد مكان تحميل الملفات. في حال حذفت كائن الخيارات ، سيتم الاحتفاظ بالملفات في الذاكرة ولن تتم كتابتها مطلقًا على القرص. @@ -122,10 +122,10 @@ app.post('/profile', upload.none(), function (req, res, next) { مفتاح | وصف --- | --- -`dest` أو `storage` | مكان لتخزين الملفات +`dest` أو `storage` | مكان لتخزين الملفات `fileFilter` | دالة للسيطرة على الملفات التي يتم قبولها -`limits` | حدود البيانات التي تم تحميلها -`preservePath` | الاحتفظ بالمسار الكامل للملفات بدلاً من الاسم الأساسي +`limits` | حدود البيانات التي تم تحميلها +`preservePath` | الاحتفظ بالمسار الكامل للملفات بدلاً من الاسم الأساسي في تطبيق ويب متوسط ​​، قد تكون هناك حاجة فقط إلى `dest`، وتكوينها كما هو موضح في المثال التالي : diff --git a/doc/README-es.md b/doc/README-es.md index 32e7d5fc..f633b7da 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -51,8 +51,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body contendrá los campos de texto, si los hubiera. }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files es un objeto (String -> Array) donde el nombre del campo es la clave (key) y el valor es el arreglo (array) de archivos // // Ejemplo @@ -84,7 +84,7 @@ Este es un ejemplo de cómo se utiliza multer en un formulario HTML. Presta espe
- +
``` diff --git a/doc/README-fr.md b/doc/README-fr.md index 3f3f2150..29417b12 100644 --- a/doc/README-fr.md +++ b/doc/README-fr.md @@ -1,6 +1,6 @@ # Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) -Multer est un middleware node.js pour la gestion des données `multipart/form-data` qui est principalement utilisé pour télécharger des fichiers. +Multer est un middleware node.js pour la gestion des données `multipart/form-data` qui est principalement utilisé pour télécharger des fichiers. Il est écrit au-dessus de [busboy](https://github.com/mscdex/busboy) pour une efficacité maximale. **NOTE**: Multer ne traitera aucun formulaire qui ne soit pas un multipart (`multipart/form-data`). @@ -55,8 +55,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body contiendra les champs de texte, s'il y en avait }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files est un objet (String -> Array) où fieldname est la clé et la valeur est un tableau de fichiers // // e.g. @@ -87,7 +87,7 @@ Voici un exemple d'utilisation de multer dans un formulaire HTML. Faites particu
- +
``` @@ -232,7 +232,7 @@ doit renvoyer un nom de fichier complet avec une extension de fichier. Chaque fonction reçoit à la fois la requête (`req`) et des informations sur le dossier (`file`) pour aider à la décision. -Notez que `req.body` n'a peut-être pas encore été entièrement rempli. Cela dépend de l'ordre +Notez que `req.body` n'a peut-être pas encore été entièrement rempli. Cela dépend de l'ordre où le client transmet les champs et les fichiers au serveur. Pour comprendre la convention d'appel utilisée dans le rappel (nécessité de passer diff --git a/doc/README-ko.md b/doc/README-ko.md index 90ef53a8..cc221988 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -44,8 +44,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // 텍스트 필드가 있는 경우, req.body가 이를 포함할 것입니다. }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files는 (String -> Array) 형태의 객체 입니다. // 필드명은 객체의 key에, 파일 정보는 배열로 value에 저장됩니다. // diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index f97306c1..f71b64bd 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -4,7 +4,7 @@ Multer é um middleware node.js para manipulação `multipart/form-data`, que é **NOTA**: Multer não processará nenhum formulário que não seja multipart (`multipart/form-data`). -## Traduções +## Traduções Este README também está disponível em outros idiomas: @@ -56,8 +56,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body conterá os campos de texto, se houver }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files é um objeto (String -> Array) onde fieldname é a chave e o valor é array de arquivos // // e.g. @@ -251,7 +251,7 @@ A especificação dos limites pode ajudar a proteger seu site contra ataques de ### `fileFilter` -Defina isso para uma função para controlar quais arquivos devem ser enviados e quais devem ser ignorados. +Defina isso para uma função para controlar quais arquivos devem ser enviados e quais devem ser ignorados. A função deve ficar assim: diff --git a/doc/README-ru.md b/doc/README-ru.md index 23615c27..d7dd5b64 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -4,7 +4,7 @@ Multer — это middleware для фреймворка express для обра **ВАЖНО**: Multer не обрабатывает никакой другой тип форм, кроме `multipart/form-data`. -## Переводы +## Переводы Это README также доступно на других языках: @@ -52,8 +52,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body сохранит текстовые поля, если они будут }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files - объект (String -> Array), где fieldname - ключ, и значение - массив файлов // // например: @@ -153,7 +153,7 @@ const upload = multer({ dest: 'uploads/' }) #### `DiskStorage` -Движок дискового пространства. Дает полный контроль над размещением файлов на диск. +Движок дискового пространства. Дает полный контроль над размещением файлов на диск. ```javascript const storage = multer.diskStorage({ @@ -168,13 +168,13 @@ const storage = multer.diskStorage({ const upload = multer({ storage: storage }) ``` -Доступно две опции, расположение `destination` и имя файла `filename`. Обе эти функции определяют, где будет находиться файл после загрузки. +Доступно две опции, расположение `destination` и имя файла `filename`. Обе эти функции определяют, где будет находиться файл после загрузки. `destination` используется, чтобы задать каталог, в котором будут размещены файлы. Может быть задан строкой (например, `'/tmp/uploads'`). Если не задано расположение `destination`, операционная система воспользуется для сохранения каталогом для временных файлов. -**Важно:** Вы должны создать каталог, когда используете `destination`. При передачи в качестве аргумента строки, Multer проверяет, что каталог создан. +**Важно:** Вы должны создать каталог, когда используете `destination`. При передачи в качестве аргумента строки, Multer проверяет, что каталог создан. -`filename` используется, чтобы определить, как будет назван файл внутри каталога. Если +`filename` используется, чтобы определить, как будет назван файл внутри каталога. Если имя файла `filename` не задано, каждому файлу будет сконфигурировано случайное имя без расширения файла. **Важно:** Multer не добавляет никакого файлового расширения, ваша функция должна возвращать имя файла с необходимым расширением. @@ -191,13 +191,13 @@ const upload = multer({ storage: storage }) const storage = multer.memoryStorage() const upload = multer({ storage: storage }) ``` -Когда вы используете этот тип передачи, информация о файле будет содержать поле `buffer`, которое содержит весь файл. +Когда вы используете этот тип передачи, информация о файле будет содержать поле `buffer`, которое содержит весь файл. **ПРЕДУПРЕЖДЕНИЕ**: Загрузка очень больших файлов, или относительно небольших файлов в большом количестве может вызвать переполнение памяти. ### `limits` -Объект, устанавливающий ограничения. Multer прокидывает этот объект напрямую в busboy, поэтому детали можно посмотреть +Объект, устанавливающий ограничения. Multer прокидывает этот объект напрямую в busboy, поэтому детали можно посмотреть [на странице с методами busboy](https://github.com/mscdex/busboy#busboy-methods). Доступны следующие целочисленные значения: @@ -216,7 +216,7 @@ const upload = multer({ storage: storage }) ### `fileFilter` -Задают функцию для того, чтобы решать, какие файлы будут загружены, а какие — нет. Функция может выглядеть так: +Задают функцию для того, чтобы решать, какие файлы будут загружены, а какие — нет. Функция может выглядеть так: ```javascript function fileFilter (req, file, cb) { diff --git a/doc/README-uz.md b/doc/README-uz.md index 80132fa7..f64cc76d 100644 --- a/doc/README-uz.md +++ b/doc/README-uz.md @@ -4,7 +4,7 @@ Multer - bu nodejs middleware bo'lib, asosan `multipart/form-data` shaklda yubor **Muhim**: Multer `multipart` bo'lmagan har qanday formani qayta ishlamaydi. -## Tarjimalar +## Tarjimalar Bu README boshqa tillarda ham mavjud: @@ -55,8 +55,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body agar matnli maydonlar (fields) bo'lsa, ularni saqlanadi }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files - bu ob'ekt (String -> Array), matn maydoni(fieldname) - bu key, va qiymat - fayllar massivi // // misol: @@ -100,7 +100,7 @@ Kalit(key) | Ta'rif | Eslatma ### `multer(opts)` -Multer qo'shimcha ob'ekt qabul qiladi, ulardan eng asosiysi - `dest`, +Multer qo'shimcha ob'ekt qabul qiladi, ulardan eng asosiysi - `dest`, Multerga fayllarni qayerga yuklash kerakligini aytadigan xususiyat. Agarda siz qo'shimcha(`options`) ob'ektni tashlab ketsangiz, fayllar xotirada saqlanadi va hech qachon diskka yozilmaydi. Standart holatda - Multer nomlashda kelib chiqishi mumkin bo'lgan muammolarni oldini olish uchun fayllar nomini o'zgartiradi. O'z talablaringizga mos ravishda nomlash funksiyasini sozlay olashingiz mumkin. @@ -156,7 +156,7 @@ Ushbu so'rov barcha fayllarni qabul qiladi, fayllar `req.files` ichida saqlanadi #### `DiskStorage` -Diskka saqlash motori(engine) sizga fayllarni saqlashda to'liq nazorat qilish imkonini beradi. +Diskka saqlash motori(engine) sizga fayllarni saqlashda to'liq nazorat qilish imkonini beradi. ```javascript const storage = multer.diskStorage({ @@ -202,7 +202,7 @@ Xotirada saqlash paytida, fayl ma'lumotlari `buffer` deb nomlanadigan maydonni o ### `limits` -Quyidagi xususiyatlar o'lchov(limit)larni aniqlaydigan obyekt. Multer ushbu obyektni to'g'ridan-to'g'ri busboy ga o'tkazadi va xususiyatlar tafsilotlari [busboy sahifasida](https://github.com/mscdex/busboy#busboy-methods)dan topishingiz mumkin. +Quyidagi xususiyatlar o'lchov(limit)larni aniqlaydigan obyekt. Multer ushbu obyektni to'g'ridan-to'g'ri busboy ga o'tkazadi va xususiyatlar tafsilotlari [busboy sahifasida](https://github.com/mscdex/busboy#busboy-methods)dan topishingiz mumkin. Quyidagi butun qiymatlar mavjud: @@ -225,7 +225,7 @@ Bu, qaysi fayllarni yuklashi, qaysilarini o'tkazib yuborish kerakligini boshqari ```javascript function fileFilter (req, file, cb) { - // Bu funksiya, faylni qabul qilish kerakligini anglatish uchun `cb` ni + // Bu funksiya, faylni qabul qilish kerakligini anglatish uchun `cb` ni // boolean qiymat bilan chaqirish kerak. // Faylni qabul qilishni rad etish uchun false quyudagicha berilishi kerak: diff --git a/doc/README-vi.md b/doc/README-vi.md index ac045f23..b5d8bcbd 100644 --- a/doc/README-vi.md +++ b/doc/README-vi.md @@ -54,11 +54,11 @@ app.post('/photos/upload', upload.array('photos', 12), function( // req.body sẽ giữ thông tin gắn kèm (vd: text fields), nếu có }); -var cpUpload = upload.fields([ +var uploadMiddleware = upload.fields([ { name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }, ]); -app.post('/cool-profile', cpUpload, function(req, res, next) { +app.post('/cool-profile', uploadMiddleware, function(req, res, next) { // req.files là một object kiểu (String -> Array) mà fieldname là key, và value là mảng các files // // vd: diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 3db8c099..66699dda 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -47,8 +47,8 @@ app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) // req.body 将具有文本域数据,如果存在的话 }) -const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) -app.post('/cool-profile', cpUpload, function (req, res, next) { +const uploadMiddleware = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }]) +app.post('/cool-profile', uploadMiddleware, function (req, res, next) { // req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组 // // 例如: From bde1822c232dd7ab2da3d542914d9927cc1675fa Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 11 May 2025 02:56:01 -0500 Subject: [PATCH 085/103] ci: add ci pipeline to `lts` branch (#1302) --- .github/workflows/ci.yml | 166 +++++++++++++++++++++++++++++++++++++++ package.json | 5 +- 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..66650441 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,166 @@ +name: ci + +on: +- pull_request +- push + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + name: + - Node.js 6.x + - Node.js 8.x + - Node.js 10.x + - Node.js 11.x + - Node.js 12.x + - Node.js 13.x + - Node.js 14.x + - Node.js 15.x + - Node.js 16.x + - Node.js 17.x + - Node.js 18.x + - Node.js 19.x + - Node.js 20.x + - Node.js 21.x + - Node.js 22.x + - Node.js 23.x + - Node.js 24.x + + include: + - name: Node.js 6.x + node-version: "6.17" + npm-i: mocha@6.2.2 nyc@14.1.1 + + - name: Node.js 8.x + node-version: "8.17" + npm-i: mocha@7.1.2 nyc@14.1.1 + + - name: Node.js 10.x + node-version: "10.24" + npm-i: mocha@8.4.0 + + - name: Node.js 11.x + node-version: "11.15" + npm-i: mocha@8.4.0 + + - name: Node.js 12.x + node-version: "12.22" + npm-i: mocha@9.2.2 + + - name: Node.js 13.x + node-version: "13.14" + npm-i: mocha@9.2.2 + + - name: Node.js 14.x + node-version: "14.21" + + - name: Node.js 15.x + node-version: "15.14" + + - name: Node.js 16.x + node-version: "16.20" + + - name: Node.js 17.x + node-version: "17.9" + + - name: Node.js 18.x + node-version: "18.18" + + - name: Node.js 19.x + node-version: "19.9" + + - name: Node.js 20.x + node-version: "20.9" + + - name: Node.js 21.x + node-version: "21" + + - name: Node.js 22.x + node-version: "22" + + - name: Node.js 23.x + node-version: "23" + + - name: Node.js 24.x + node-version: "24" + + steps: + - uses: actions/checkout@v4 + + - name: Install Node.js ${{ matrix.node-version }} + shell: bash -eo pipefail -l {0} + run: | + nvm install --default ${{ matrix.node-version }} + if [[ "${{ matrix.node-version }}" == 0.* && "$(cut -d. -f2 <<< "${{ matrix.node-version }}")" -lt 10 ]]; then + nvm install --alias=npm 0.10 + nvm use ${{ matrix.node-version }} + if [[ "$(npm -v)" == 1.1.* ]]; then + nvm exec npm npm install -g npm@1.1 + ln -fs "$(which npm)" "$(dirname "$(nvm which npm)")/npm" + else + sed -i '1s;^.*$;'"$(printf '#!%q' "$(nvm which npm)")"';' "$(readlink -f "$(which npm)")" + fi + npm config set strict-ssl false + fi + dirname "$(nvm which ${{ matrix.node-version }})" >> "$GITHUB_PATH" + + - name: Configure npm + run: | + if [[ "$(npm config get package-lock)" == "true" ]]; then + npm config set package-lock false + else + npm config set shrinkwrap false + fi + + - name: Remove npm module(s) ${{ matrix.npm-rm }} + run: npm rm --silent --save-dev ${{ matrix.npm-rm }} + if: matrix.npm-rm != '' + + - name: Install npm module(s) ${{ matrix.npm-i }} + run: npm install --save-dev ${{ matrix.npm-i }} + if: matrix.npm-i != '' + + - name: Install Node.js dependencies + run: npm install + + - name: List environment + id: list_env + shell: bash + run: | + echo "node@$(node -v)" + echo "npm@$(npm -v)" + npm -s ls ||: + (npm -s ls --depth=0 ||:) | awk -F'[ @]' 'NR>1 && $2 { print $2 "=" $3 }' >> "$GITHUB_OUTPUT" + + - name: Lint code + run: npm run lint + + - name: Run tests + shell: bash + run: | + if npm -ps ls nyc | grep -q nyc; then + npm run test-ci + else + npm test + fi + + - name: Collect code coverage + uses: coverallsapp/github-action@master + if: steps.list_env.outputs.nyc != '' + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + flag-name: run-${{ matrix.test_number }} + parallel: true + + coverage: + needs: test + runs-on: ubuntu-latest + steps: + - name: Upload code coverage + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + parallel-finished: true diff --git a/package.json b/package.json index 32507d88..f1479430 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,9 @@ "lib/" ], "scripts": { - "test": "standard && mocha" + "lint": "standard", + "test": "mocha --reporter spec --exit --check-leaks test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" } } From 7dff48d920a9de311601c993ec456e019f24eba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulises=20Gasc=C3=B3n?= Date: Mon, 12 May 2025 08:10:04 +0200 Subject: [PATCH 086/103] ci: use `ubuntu-latest` as default runner (#1308) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4f5cae7..6cebb77e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ on: jobs: test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: matrix: name: From 435be6c4bc641b341a67cb3789fe654e6ad2dc1c Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Fri, 16 May 2025 10:43:56 -0500 Subject: [PATCH 087/103] ci: add CodeQL (SAST) (#1289) --- .github/workflows/codeql.yml | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..9d1b3041 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,66 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: ["master"] + pull_request: + # The branches below must be a subset of the branches above + branches: ["master"] + schedule: + - cron: "0 0 * * 1" + +permissions: + contents: read + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + steps: + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + with: + languages: javascript + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + # - name: Autobuild + # uses: github/codeql-action/autobuild@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 + with: + category: "/language:javascript" \ No newline at end of file From 6517e9af47736f4df0c589afacb561349265e1c9 Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Fri, 16 May 2025 10:44:37 -0500 Subject: [PATCH 088/103] docs: update readme badges (#1268) --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b1975bb..ea3a8dd5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. @@ -334,3 +334,13 @@ For information on how to build your own storage engine, see [Multer Storage Eng ## License [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file From 2c8505f207d923dd8de13a9f93a4563e59933665 Mon Sep 17 00:00:00 2001 From: Chris de Almeida Date: Mon, 19 May 2025 11:56:25 -0500 Subject: [PATCH 089/103] =?UTF-8?q?=F0=9F=90=9B=20drain=20stream.=20fixes?= =?UTF-8?q?=20regression=20in=20node=2018,=20remove=20old=20CI,=20set=20mi?= =?UTF-8?q?nimum=20node=20version,=20fix=20readme=20badges,=20add=20.npmrc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: handle two busboy error events ♻️ fully drain stream 🥅 explicitly handle req error 🚨 lint:fix 🔖 v2.0.0 ⬆️ bump mocha docs: include release 2.0.0 details --------- Co-authored-by: mhassan1 Co-authored-by: Ulises Gascón --- .github/workflows/ci.yml | 20 ++-------------- .npmrc | 1 + CHANGELOG.md | 6 +++++ README.md | 2 +- lib/make-middleware.js | 14 ++++++++++- package.json | 7 +++--- test/express-integration.js | 46 +++++++++++++++++++++++++++++++++++++ 7 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 .npmrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66650441..21a0b5e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,8 +11,6 @@ jobs: fail-fast: false matrix: name: - - Node.js 6.x - - Node.js 8.x - Node.js 10.x - Node.js 11.x - Node.js 12.x @@ -30,14 +28,6 @@ jobs: - Node.js 24.x include: - - name: Node.js 6.x - node-version: "6.17" - npm-i: mocha@6.2.2 nyc@14.1.1 - - - name: Node.js 8.x - node-version: "8.17" - npm-i: mocha@7.1.2 nyc@14.1.1 - - name: Node.js 10.x node-version: "10.24" npm-i: mocha@8.4.0 @@ -56,9 +46,11 @@ jobs: - name: Node.js 14.x node-version: "14.21" + npm-i: mocha@9.2.2 - name: Node.js 15.x node-version: "15.14" + npm-i: mocha@9.2.2 - name: Node.js 16.x node-version: "16.20" @@ -107,14 +99,6 @@ jobs: fi dirname "$(nvm which ${{ matrix.node-version }})" >> "$GITHUB_PATH" - - name: Configure npm - run: | - if [[ "$(npm config get package-lock)" == "true" ]]; then - npm config set package-lock false - else - npm config set shrinkwrap false - fi - - name: Remove npm module(s) ${{ matrix.npm-rm }} run: npm rm --silent --save-dev ${{ matrix.npm-rm }} if: matrix.npm-rm != '' diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..43c97e71 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/CHANGELOG.md b/CHANGELOG.md index cf62190a..ce891747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 2.0.0 + +- **Breaking change: The minimum supported Node version is now 10.16.0** +- Fix [CVE-2025-47935](https://www.cve.org/CVERecord?id=CVE-2025-47935) ([GHSA-44fp-w29j-9vj5](https://github.com/expressjs/multer/security/advisories/GHSA-44fp-w29j-9vj5)) +- Fix [CVE-2025-47944](https://www.cve.org/CVERecord?id=CVE-2025-47944) ([GHSA-4pg4-qvpc-4q3h](https://github.com/expressjs/multer/security/advisories/GHSA-4pg4-qvpc-4q3h)) + ## 1.4.5-lts.2 - Fix out-of-band error event from busboy (#1177) diff --git a/README.md b/README.md index 7f5d0807..499f6e8e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer is a node.js middleware for handling `multipart/form-data`, which is primarily used for uploading files. It is written on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. diff --git a/lib/make-middleware.js b/lib/make-middleware.js index cc26414a..81a90cf6 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -8,6 +8,12 @@ var MulterError = require('./multer-error') var FileAppender = require('./file-appender') var removeUploadedFiles = require('./remove-uploaded-files') +function drainStream (stream) { + stream.on('readable', () => { + while (stream.read() !== null) {} + }) +} + function makeMiddleware (setup) { return function multerMiddleware (req, res, next) { if (!is(req, ['multipart'])) return next() @@ -22,6 +28,10 @@ function makeMiddleware (setup) { req.body = Object.create(null) + req.on('error', function (err) { + abortWithError(err) + }) + var busboy try { @@ -41,7 +51,9 @@ function makeMiddleware (setup) { if (isDone) return isDone = true req.unpipe(busboy) - process.nextTick(() => { + drainStream(req) + req.resume() + setImmediate(() => { busboy.removeAllListeners() }) next(err) diff --git a/package.json b/package.json index f1479430..862aec46 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "1.4.5-lts.2", + "version": "2.0.0", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", @@ -32,13 +32,13 @@ "express": "^4.13.1", "form-data": "^1.0.0-rc1", "fs-temp": "^1.1.2", - "mocha": "^3.5.3", + "mocha": "^11.3.0", "rimraf": "^2.4.1", "standard": "^14.3.3", "testdata-w3c-json-form": "^1.0.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" }, "files": [ "LICENSE", @@ -48,6 +48,7 @@ ], "scripts": { "lint": "standard", + "lint:fix": "standard --fix", "test": "mocha --reporter spec --exit --check-leaks test/", "test-ci": "nyc --reporter=lcov --reporter=text npm test", "test-cov": "nyc --reporter=html --reporter=text npm test" diff --git a/test/express-integration.js b/test/express-integration.js index 74ebfed4..ff1757b4 100644 --- a/test/express-integration.js +++ b/test/express-integration.js @@ -150,4 +150,50 @@ describe('Express Integration', function () { req.write(body) req.end() }) + + it('should not crash on malformed request that causes two errors to be emitted by busboy', function (done) { + var upload = multer() + + app.post('/upload2', upload.single('file'), function (req, res) { + res.status(500).end('Request should not be processed') + }) + + app.use(function (err, req, res, next) { + assert.strictEqual(err.message, 'Malformed part header') + res.status(200).end('Correct error') + }) + + var boundary = 'AaB03x' + // this payload causes two errors to be emitted by busboy: `Malformed part header` and `Unexpected end of form` + var body = [ + '--' + boundary, + 'Content-Disposition: form-data; name="file"; filename="test.txt"', + 'Content-Type: text/plain', + '', + '--' + boundary + '--', + '' + ].join('\r\n') + var options = { + hostname: 'localhost', + port, + path: '/upload2', + method: 'POST', + headers: { + 'content-type': 'multipart/form-data; boundary=' + boundary, + 'content-length': body.length + } + } + + var req = http.request(options, (res) => { + assert.strictEqual(res.statusCode, 200) + done() + }) + + req.on('error', (err) => { + done(err) + }) + + req.write(body) + req.end() + }) }) From 62cfea2b198732f727240b994b134e5e35aab105 Mon Sep 17 00:00:00 2001 From: Chris de Almeida Date: Wed, 21 May 2025 14:16:55 -0500 Subject: [PATCH 090/103] =?UTF-8?q?=F0=9F=93=9D=20fix=20changelog=20inform?= =?UTF-8?q?ation=20(#1316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce891747..d7b5a433 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## 1.4.4-lts.1 - Bugfix: Bump busboy to fix CVE-2022-24434 (#1097) -- Breaking: Require Node.js 6.0.0 or later (#1097) +- Breaking: Require Node.js 10.16.0 or later (#1097) ## 1.4.4 - 2021-12-07 From 3c1a473b93f4caf127c78930593ab3c201f288b9 Mon Sep 17 00:00:00 2001 From: I F E D I L I Date: Thu, 22 May 2025 08:29:32 +0100 Subject: [PATCH 091/103] chore: fix typo (#993) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea3a8dd5..8c968dd8 100644 --- a/README.md +++ b/README.md @@ -232,7 +232,7 @@ If no `filename` is given, each file will be given a random name that doesn't include any file extension. **Note:** Multer will not append any file extension for you, your function -should return a filename complete with an file extension. +should return a filename complete with a file extension. Each function gets passed both the request (`req`) and some information about the file (`file`) to aid with the decision. From 28ae591016f9e08acb3d924c0ec84c38d4c3ce07 Mon Sep 17 00:00:00 2001 From: Matt Fay Date: Thu, 22 May 2025 03:30:56 -0400 Subject: [PATCH 092/103] docs: remove reference to `--save` npm flag (#929) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c968dd8..21fc8322 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This README is also available in other languages: ## Installation ```sh -$ npm install --save multer +$ npm install multer ``` ## Usage From 1b92c6786fae84a9cd202d38ea62f46804dccde0 Mon Sep 17 00:00:00 2001 From: Carlos Stenzel Date: Thu, 22 May 2025 04:33:03 -0300 Subject: [PATCH 093/103] docs: update badge links in docs (#1273) --- doc/README-ar.md | 2 +- doc/README-es.md | 2 +- doc/README-fr.md | 2 +- doc/README-ko.md | 2 +- doc/README-pt-br.md | 2 +- doc/README-ru.md | 2 +- doc/README-uz.md | 2 +- doc/README-vi.md | 2 +- doc/README-zh-cn.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/README-ar.md b/doc/README-ar.md index 8a6d681b..b8a5342e 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)
diff --git a/doc/README-es.md b/doc/README-es.md index f633b7da..b4e69911 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. diff --git a/doc/README-fr.md b/doc/README-fr.md index 29417b12..8f07dfac 100644 --- a/doc/README-fr.md +++ b/doc/README-fr.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer est un middleware node.js pour la gestion des données `multipart/form-data` qui est principalement utilisé pour télécharger des fichiers. Il est écrit au-dessus de [busboy](https://github.com/mscdex/busboy) pour une efficacité maximale. diff --git a/doc/README-ko.md b/doc/README-ko.md index cc221988..149929a8 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다루기 위한 node.js 의 미들웨어 입니다. 효율성을 최대화 하기 위해 [busboy](https://github.com/mscdex/busboy) 를 기반으로 하고 있습니다. diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index f71b64bd..b663e8ad 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. Foi escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. diff --git a/doc/README-ru.md b/doc/README-ru.md index d7dd5b64..e8e7b637 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer — это middleware для фреймворка express для обработки `multipart/form-data`, нужная в первую очередь при загрузке файлов. Написана как обертка над [busboy](https://github.com/mscdex/busboy) для ее максимально эффективного использования. diff --git a/doc/README-uz.md b/doc/README-uz.md index f64cc76d..899bb080 100644 --- a/doc/README-uz.md +++ b/doc/README-uz.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer - bu nodejs middleware bo'lib, asosan `multipart/form-data` shaklda yuborilgan fayllarni yuklashda ishlatiladi. Yuqori samaradorlikka erishish uchun [busboy](https://github.com/mscdex/busboy)ning ustiga yozilgan. diff --git a/doc/README-vi.md b/doc/README-vi.md index b5d8bcbd..c206a639 100644 --- a/doc/README-vi.md +++ b/doc/README-vi.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer là thư viện trung gian hỗ trợ việc xử lý `multipart/form-data`, mục đích chính cho việc upload file. Thư viện này dựa trên [busboy](https://github.com/mscdex/busboy) để hiệu quả hơn. diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 66699dda..f5a3a66d 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -2,7 +2,7 @@ **甚至可能存在翻译错误!你可能需要阅读原版英语[README](../README.md)** **此文档仅供参考!** -# Multer [![Build Status](https://travis-ci.org/expressjs/multer.svg?branch=master)](https://travis-ci.org/expressjs/multer) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型的表单数据,它主要用于上传文件。它是写在 [busboy](https://github.com/mscdex/busboy) 之上非常高效。 From de80e57b26eaca762829c1e01a2b378d0532eb4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulises=20Gasc=C3=B3n?= Date: Thu, 22 May 2025 16:18:28 +0200 Subject: [PATCH 094/103] ci: change branch reference --- .github/workflows/scorecard.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 66393ed2..276db769 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -13,7 +13,7 @@ on: schedule: - cron: '16 21 * * 1' push: - branches: [ "master" ] + branches: [ "main" ] # Declare default permissions as read only. permissions: read-all @@ -71,4 +71,4 @@ jobs: uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: results.sarif - \ No newline at end of file + From dc2a880e76b210088ce841ca264fdea5744f8358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulises=20Gasc=C3=B3n?= Date: Thu, 22 May 2025 16:19:18 +0200 Subject: [PATCH 095/103] ci: change branch reference --- .github/workflows/codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9d1b3041..378619a3 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -13,10 +13,10 @@ name: "CodeQL" on: push: - branches: ["master"] + branches: ["main", "v2"] pull_request: # The branches below must be a subset of the branches above - branches: ["master"] + branches: ["main", "v2] schedule: - cron: "0 0 * * 1" @@ -63,4 +63,4 @@ jobs: - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@3ab4101902695724f9365a384f86c1074d94e18c # v3.24.7 with: - category: "/language:javascript" \ No newline at end of file + category: "/language:javascript" From dd9dde4da1a40a6f03229233491fc5f68ed0012a Mon Sep 17 00:00:00 2001 From: Chris de Almeida Date: Fri, 23 May 2025 01:07:56 -0500 Subject: [PATCH 096/103] =?UTF-8?q?=F0=9F=93=9D=20fix=20badges=20in=20tran?= =?UTF-8?q?slation=20files=20(#1321)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/README-ar.md | 12 +++++++++++- doc/README-es.md | 12 +++++++++++- doc/README-fr.md | 12 +++++++++++- doc/README-ko.md | 12 +++++++++++- doc/README-pt-br.md | 12 +++++++++++- doc/README-ru.md | 12 +++++++++++- doc/README-uz.md | 12 +++++++++++- doc/README-vi.md | 12 +++++++++++- doc/README-zh-cn.md | 12 +++++++++++- 9 files changed, 99 insertions(+), 9 deletions(-) diff --git a/doc/README-ar.md b/doc/README-ar.md index b8a5342e..331c0a73 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
@@ -309,3 +309,13 @@ app.post('/profile', function (req, res) { ## الترخيص [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-es.md b/doc/README-es.md index b4e69911..0ae25123 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, el cuál es usado sobre todo para la subida de archivos. Está escrito sobre [busboy](https://github.com/mscdex/busboy) para maximizar su eficiencia. @@ -296,3 +296,13 @@ Para más información acerca de cómo construir tu propio mecanismo de almacena ## Licencia [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-fr.md b/doc/README-fr.md index 8f07dfac..321a3148 100644 --- a/doc/README-fr.md +++ b/doc/README-fr.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer est un middleware node.js pour la gestion des données `multipart/form-data` qui est principalement utilisé pour télécharger des fichiers. Il est écrit au-dessus de [busboy](https://github.com/mscdex/busboy) pour une efficacité maximale. @@ -329,3 +329,13 @@ Pour plus d'informations sur la création de votre propre moteur de stockage, co ## License [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-ko.md b/doc/README-ko.md index 149929a8..ce3dae3d 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다루기 위한 node.js 의 미들웨어 입니다. 효율성을 최대화 하기 위해 [busboy](https://github.com/mscdex/busboy) 를 기반으로 하고 있습니다. @@ -256,3 +256,13 @@ app.post('/profile', function (req, res) { ## 라이센스 [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index b663e8ad..e45c9a17 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer é um middleware node.js para manipulação `multipart/form-data`, que é usado principalmente para fazer upload de arquivos. Foi escrito em cima do [busboy](https://github.com/mscdex/busboy) para máxima eficiência. @@ -303,3 +303,13 @@ Para obter informações sobre como criar seu próprio mecanismo de armazenament ## Licença [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-ru.md b/doc/README-ru.md index e8e7b637..ae21af01 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer — это middleware для фреймворка express для обработки `multipart/form-data`, нужная в первую очередь при загрузке файлов. Написана как обертка над [busboy](https://github.com/mscdex/busboy) для ее максимально эффективного использования. @@ -266,3 +266,13 @@ app.post('/profile', function (req, res) { ## Лицензия [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-uz.md b/doc/README-uz.md index 899bb080..6ef457b5 100644 --- a/doc/README-uz.md +++ b/doc/README-uz.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer - bu nodejs middleware bo'lib, asosan `multipart/form-data` shaklda yuborilgan fayllarni yuklashda ishlatiladi. Yuqori samaradorlikka erishish uchun [busboy](https://github.com/mscdex/busboy)ning ustiga yozilgan. @@ -271,3 +271,13 @@ O'zingizning saqlash dvigatelingizni qanday yaratish haqida ma'lumot olish: [Max ## Litsenziya [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-vi.md b/doc/README-vi.md index c206a639..e4ef2252 100644 --- a/doc/README-vi.md +++ b/doc/README-vi.md @@ -1,4 +1,4 @@ -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer là thư viện trung gian hỗ trợ việc xử lý `multipart/form-data`, mục đích chính cho việc upload file. Thư viện này dựa trên [busboy](https://github.com/mscdex/busboy) để hiệu quả hơn. @@ -288,3 +288,13 @@ app.post('/profile', function(req, res) { ## License [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index f5a3a66d..0ed01dce 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -2,7 +2,7 @@ **甚至可能存在翻译错误!你可能需要阅读原版英语[README](../README.md)** **此文档仅供参考!** -# Multer [![Build Status](https://badgen.net/github/checks/expressjs/multer/master?label=ci)](https://github.com/expressjs/multer/actions/workflows/ci.yml) [![Test Coverage](https://badgen.net/coveralls/c/github/expressjs/multer/master)](https://coveralls.io/r/expressjs/multer?branch=master) [![NPM version](https://badge.fury.io/js/multer.svg)](https://badge.fury.io/js/multer) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard) +# Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型的表单数据,它主要用于上传文件。它是写在 [busboy](https://github.com/mscdex/busboy) 之上非常高效。 @@ -261,3 +261,13 @@ app.post('/profile', function (req, res) { ## License [MIT](LICENSE) + +[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml +[test-url]: https://coveralls.io/r/expressjs/multer?branch=master +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[npm-downloads-image]: https://badgen.net/npm/dm/multer +[npm-url]: https://npmjs.org/package/multer +[npm-version-image]: https://badgen.net/npm/v/multer +[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge +[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer \ No newline at end of file From 256da2f6eb8377b09740e78f8dacfad52a2b5122 Mon Sep 17 00:00:00 2001 From: ctcpip Date: Fri, 23 May 2025 10:12:18 -0500 Subject: [PATCH 097/103] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20use=20version=20ta?= =?UTF-8?q?g=20for=20CI,=20fix=20CI=20badge,=20fix=20references=20to=20mas?= =?UTF-8?q?ter/main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 4 ++-- README.md | 28 ++++++++++++++-------------- doc/README-ar.md | 24 ++++++++++++------------ doc/README-es.md | 20 ++++++++++---------- doc/README-fr.md | 26 +++++++++++++------------- doc/README-ko.md | 20 ++++++++++---------- doc/README-pt-br.md | 30 +++++++++++++++--------------- doc/README-ru.md | 22 +++++++++++----------- doc/README-uz.md | 26 +++++++++++++------------- doc/README-vi.md | 18 +++++++++--------- doc/README-zh-cn.md | 20 ++++++++++---------- 11 files changed, 119 insertions(+), 119 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21a0b5e0..d6a945e5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -132,7 +132,7 @@ jobs: fi - name: Collect code coverage - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2 if: steps.list_env.outputs.nyc != '' with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -144,7 +144,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Upload code coverage - uses: coverallsapp/github-action@master + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} parallel-finished: true diff --git a/README.md b/README.md index 21fc8322..52fc731d 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,15 @@ on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. This README is also available in other languages: -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Arabic) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Spanish) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) -- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnam) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portuguese Brazil) -- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (French) -- [O'zbek tili](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbek) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (Arabic) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (Spanish) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Russian) +- [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) (Vietnam) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (Portuguese Brazil) +- [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) (French) +- [O'zbek tili](https://github.com/expressjs/multer/blob/main/doc/README-uz.md) (Uzbek) ## Installation @@ -308,7 +308,7 @@ When encountering an error, Multer will delegate the error to Express. You can display a nice error page using [the standard express way](http://expressjs.com/guide/error-handling.html). If you want to catch errors specifically from Multer, you can call the -middleware function by yourself. Also, if you want to catch only [the Multer errors](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), you can use the `MulterError` class that is attached to the `multer` object itself (e.g. `err instanceof multer.MulterError`). +middleware function by yourself. Also, if you want to catch only [the Multer errors](https://github.com/expressjs/multer/blob/main/lib/multer-error.js), you can use the `MulterError` class that is attached to the `multer` object itself (e.g. `err instanceof multer.MulterError`). ```javascript const multer = require('multer') @@ -329,16 +329,16 @@ app.post('/profile', function (req, res) { ## Custom storage engine -For information on how to build your own storage engine, see [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +For information on how to build your own storage engine, see [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## License [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-ar.md b/doc/README-ar.md index 331c0a73..ad577552 100644 --- a/doc/README-ar.md +++ b/doc/README-ar.md @@ -11,13 +11,13 @@ هذا الملف متاح أيضًا بلغات أخرى: -- [English](https://github.com/expressjs/multer/blob/master/README.md) (الإنجليزية) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (الإسبانية) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (الصينية) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (الكورية) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (الروسية) -- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (الفتنامية) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (البرتغالية) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (الإنجليزية) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (الإسبانية) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (الصينية) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (الكورية) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (الروسية) +- [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) (الفتنامية) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (البرتغالية) ## التنصيب @@ -279,7 +279,7 @@ function fileFilter (req, file, cb) { عند مواجهة خطأ ، سيقوم Multer بتفويض الخطأ إلى Express. يمكنك عرض صفحة خطأ لطيفة باستخدام [طريقة Express القياسية](http://expressjs.com/guide/error-handling.html). -إذا كنت تريد إنتقاء الأخطاء والحصول على [أخطاء Multer فقط](https://github.com/expressjs/multer/blob/master/lib/multer-error.js)، فيمكنك نداء بدالة الوسيطة من قبل نفسك. أيضًا ، إذا كنت تريد التقاط أخطاء Multer فقط ، فيمكنك استخدام صنف `MulterError` المتصل بالكائن` multer` نفسه (على سبيل المثال `err instanceof multer.MulterError`). +إذا كنت تريد إنتقاء الأخطاء والحصول على [أخطاء Multer فقط](https://github.com/expressjs/multer/blob/main/lib/multer-error.js)، فيمكنك نداء بدالة الوسيطة من قبل نفسك. أيضًا ، إذا كنت تريد التقاط أخطاء Multer فقط ، فيمكنك استخدام صنف `MulterError` المتصل بالكائن` multer` نفسه (على سبيل المثال `err instanceof multer.MulterError`).
@@ -304,16 +304,16 @@ app.post('/profile', function (req, res) { ## محرك التخزين الخاص بك -للحصول على معلومات حول كيفية إنشاء محرك التخزين الخاص بك ، راجع [محرك تخزين Multer](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +للحصول على معلومات حول كيفية إنشاء محرك التخزين الخاص بك ، راجع [محرك تخزين Multer](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## الترخيص [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-es.md b/doc/README-es.md index 0ae25123..91f7be2b 100644 --- a/doc/README-es.md +++ b/doc/README-es.md @@ -8,11 +8,11 @@ Multer es un "*middleware*" de node.js para el manejo de `multipart/form-data`, Éste archivo README también está disponible en otros lenguajes: -- [English](https://github.com/expressjs/multer/blob/master/README.md) (Inglés) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chino) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Ruso) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portugués Brasileño) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (Inglés) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chino) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Coreano) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Ruso) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (Portugués Brasileño) ## Instalación @@ -270,7 +270,7 @@ function fileFilter (req, file, cb) { Al encontrarse con un error, Multer delegará ese error a Express. Puedes mostrar una linda página de error usando [la manera standard de Express](http://expressjs.com/guide/error-handling.html). -Si quieres capturar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres capturar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). +Si quieres capturar los errores específicamente desde Multer, puedes llamar la función middleware tú mismo. También, si quieres capturar sólo [los errores de Multer](https://github.com/expressjs/multer/blob/main/lib/multer-error.js), puedes usar la clase `MulterError` que está adherida al mismo objeto `multer` (por ejemplo: `err instanceof multer.MulterError`). ```javascript const multer = require('multer') @@ -291,16 +291,16 @@ app.post('/profile', function (req, res) { ## Mecanismos de almacenamiento personalizados -Para más información acerca de cómo construir tu propio mecanismo de almacenamiento, recomendamos leer [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +Para más información acerca de cómo construir tu propio mecanismo de almacenamiento, recomendamos leer [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## Licencia [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-fr.md b/doc/README-fr.md index 321a3148..d829e998 100644 --- a/doc/README-fr.md +++ b/doc/README-fr.md @@ -9,14 +9,14 @@ Il est écrit au-dessus de [busboy](https://github.com/mscdex/busboy) pour une e This README is also available in other languages: -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Arabe) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espagnol) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinois) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coréen) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russe) -- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnamien) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Portugais du Brésil) -- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (Français) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (Arabe) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (Espagnol) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chinois) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Coréen) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Russe) +- [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) (Vietnamien) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (Portugais du Brésil) +- [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) (Français) ## Installation @@ -303,7 +303,7 @@ En cas d'erreur, Multer déléguera l'erreur à Express. Vous pouvez afficher une belle page d'erreur en utilisant [la voie express standard](http://expressjs.com/guide/error-handling.html). Si vous souhaitez détecter les erreurs spécifiquement de Multer, vous pouvez appeler la -fonction middleware par vous-même. Aussi, si vous voulez attraper seulement [les erreurs Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), vous pouvez utiliser la classe `MulterError` qui est jointe à l'objet `multer` lui-même (par exemple `err instanceof multer.MulterError`). +fonction middleware par vous-même. Aussi, si vous voulez attraper seulement [les erreurs Multer](https://github.com/expressjs/multer/blob/main/lib/multer-error.js), vous pouvez utiliser la classe `MulterError` qui est jointe à l'objet `multer` lui-même (par exemple `err instanceof multer.MulterError`). ```javascript const multer = require('multer') @@ -324,16 +324,16 @@ app.post('/profile', function (req, res) { ## Moteur de stockage personnalisé -Pour plus d'informations sur la création de votre propre moteur de stockage, consultez [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +Pour plus d'informations sur la création de votre propre moteur de stockage, consultez [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## License [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-ko.md b/doc/README-ko.md index ce3dae3d..63d33078 100644 --- a/doc/README-ko.md +++ b/doc/README-ko.md @@ -8,12 +8,12 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다 이 문서는 아래의 언어로도 제공됩니다: -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (아라비아 말) -- [English](https://github.com/expressjs/multer/blob/master/README.md) (영어) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (스페인어) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (중국어) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (러시아) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (포르투갈어 BR) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (아라비아 말) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (영어) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (스페인어) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (중국어) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (러시아) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (포르투갈어 BR) ## 설치 @@ -251,16 +251,16 @@ app.post('/profile', function (req, res) { ## 커스텀 스토리지 엔진 -자신만의 고유한 스토리지 엔진을 구축하기 위한 정보를 얻기 위해서는 [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md) 문서를 참고하세요. +자신만의 고유한 스토리지 엔진을 구축하기 위한 정보를 얻기 위해서는 [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md) 문서를 참고하세요. ## 라이센스 [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-pt-br.md b/doc/README-pt-br.md index e45c9a17..a2db4104 100644 --- a/doc/README-pt-br.md +++ b/doc/README-pt-br.md @@ -8,16 +8,16 @@ Multer é um middleware node.js para manipulação `multipart/form-data`, que é Este README também está disponível em outros idiomas: -- [English](https://github.com/expressjs/multer/blob/master/README.md) (Inglês) -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (Árabe) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Espanhol) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinês) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Coreano) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russo) -- [Việt Nam](https://github.com/expressjs/multer/blob/master/doc/README-vi.md) (Vietnã) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (Português Brasil) -- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (Francês) -- [O'zbek tili](https://github.com/expressjs/multer/blob/master/doc/README-uz.md) (Uzbequistão) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (Inglês) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (Árabe) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (Espanhol) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chinês) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Coreano) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Russo) +- [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) (Vietnã) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (Português Brasil) +- [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) (Francês) +- [O'zbek tili](https://github.com/expressjs/multer/blob/main/doc/README-uz.md) (Uzbequistão) ## Instalação @@ -277,7 +277,7 @@ function fileFilter (req, file, cb) { Quando encontrar um erro, Multer delegará o erro para Express. Você pode exibir uma boa página de erro usando [the standard express way](http://expressjs.com/guide/error-handling.html). -Se você quer pegar erros especificamente do Multer, você pode enviar para o função de middleware. Além disso, se você quiser pegar apenas [os erros do Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), você pode usar a classe `MulterError` que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). +Se você quer pegar erros especificamente do Multer, você pode enviar para o função de middleware. Além disso, se você quiser pegar apenas [os erros do Multer](https://github.com/expressjs/multer/blob/main/lib/multer-error.js), você pode usar a classe `MulterError` que está ligado ao objeto `multer` (e.g. `err instanceof multer.MulterError`). ```javascript const multer = require('multer') @@ -298,16 +298,16 @@ app.post('/profile', function (req, res) { ## Mecanismo de armazenamento personalizado -Para obter informações sobre como criar seu próprio mecanismo de armazenamento, veja [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +Para obter informações sobre como criar seu próprio mecanismo de armazenamento, veja [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## Licença [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-ru.md b/doc/README-ru.md index ae21af01..8c968b13 100644 --- a/doc/README-ru.md +++ b/doc/README-ru.md @@ -8,12 +8,12 @@ Multer — это middleware для фреймворка express для обра Это README также доступно на других языках: -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (арабский) -- [English](https://github.com/expressjs/multer/blob/master/README.md) (Английский) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (Испанский) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Китайский) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Корейский) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (бр Португальский) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (арабский) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (Английский) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (Испанский) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Китайский) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Корейский) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (бр Португальский) ## Установка @@ -240,7 +240,7 @@ function fileFilter (req, file, cb) { Когда выбрасывается исключение, Multer делегирует его обработку Express. Вы можете выводить страницу ошибки [стандартными для express способами](http://expressjs.com/guide/error-handling.html). -Если вы хотите отлавливать ошибки конкретно от Multer, вам нужно вызывать собственную middleware для их обработки. Еще, если вы хотите отлавливать [исключительно ошибки Multer](https://github.com/expressjs/multer/blob/master/lib/make-error.js#L1-L9), вы можете использовать класс `MulterError`, который привязан к объекту `multer` (например, `err instanceof multer.MulterError`) +Если вы хотите отлавливать ошибки конкретно от Multer, вам нужно вызывать собственную middleware для их обработки. Еще, если вы хотите отлавливать [исключительно ошибки Multer](https://github.com/expressjs/multer/blob/main/lib/make-error.js#L1-L9), вы можете использовать класс `MulterError`, который привязан к объекту `multer` (например, `err instanceof multer.MulterError`) ```javascript const multer = require('multer') @@ -261,16 +261,16 @@ app.post('/profile', function (req, res) { ## Собственные движки для сохранения файлов -Чтобы получить информацию, как создать собственный движок для обработки загрузки файлов, смотрите страницу [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +Чтобы получить информацию, как создать собственный движок для обработки загрузки файлов, смотрите страницу [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## Лицензия [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-uz.md b/doc/README-uz.md index 6ef457b5..9c37cb36 100644 --- a/doc/README-uz.md +++ b/doc/README-uz.md @@ -8,14 +8,14 @@ Multer - bu nodejs middleware bo'lib, asosan `multipart/form-data` shaklda yubor Bu README boshqa tillarda ham mavjud: -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (arabcha) -- [English](https://github.com/expressjs/multer/blob/master/README.md) (inglizcha) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (ispancha) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (xitoycha) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (korescha) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (portugalcha) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (ruscha) -- [Français](https://github.com/expressjs/multer/blob/master/doc/README-fr.md) (fransuzcha) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (arabcha) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (inglizcha) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (ispancha) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (xitoycha) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (korescha) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (portugalcha) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (ruscha) +- [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) (fransuzcha) ## O'rnatish @@ -244,7 +244,7 @@ function fileFilter (req, file, cb) { Xatoga duch kelganda, Multer xatoni Expressga yuboradi. [standart express usuli](http://expressjs.com/guide/error-handling.html)dan foydalanib xatoni tartibliroq chiqarishingiz mumkin. -Agar siz Multerdan chiqqan xatolarni aniqlamoqchi bo'lsangiz o'zingiz `middleware` funksiya yozishingiz mumkin. Shuningdek, agar siz faqat [Multer xatolarini](https://github.com/expressjs/multer/blob/master/lib/multer-error.js) ushlamoqchi bo'lsangiz, siz `multer` ob'ektiga yozilgan `MulterError` class ni ishlatishingiz mumkin (masalan, `err instanceof multer.MulterError`). +Agar siz Multerdan chiqqan xatolarni aniqlamoqchi bo'lsangiz o'zingiz `middleware` funksiya yozishingiz mumkin. Shuningdek, agar siz faqat [Multer xatolarini](https://github.com/expressjs/multer/blob/main/lib/multer-error.js) ushlamoqchi bo'lsangiz, siz `multer` ob'ektiga yozilgan `MulterError` class ni ishlatishingiz mumkin (masalan, `err instanceof multer.MulterError`). ```javascript @@ -266,16 +266,16 @@ app.post('/profile', function (req, res) { ## Maxsus saqlash mexanizmi -O'zingizning saqlash dvigatelingizni qanday yaratish haqida ma'lumot olish: [Maxsus saqlash mexanizmi](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +O'zingizning saqlash dvigatelingizni qanday yaratish haqida ma'lumot olish: [Maxsus saqlash mexanizmi](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## Litsenziya [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-vi.md b/doc/README-vi.md index e4ef2252..977858c6 100644 --- a/doc/README-vi.md +++ b/doc/README-vi.md @@ -8,10 +8,10 @@ Multer là thư viện trung gian hỗ trợ việc xử lý `multipart/form-dat Các bạn có thể đọc ở các bản dịch ngôn ngữ khác: -- [English](https://github.com/expressjs/multer/blob/master/README.md) (Tiếng Anh) -- [简体中文](https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (Russian) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (Tiếng Anh) +- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chinese) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Korean) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Russian) ## Cài đặt @@ -262,7 +262,7 @@ function fileFilter(req, file, cb) { Khi một lỗi xảy ra, Multer sẽ gửi lỗi đó cho Express. Bạn có thể hiển thị đẹp hơn sử dụng [cách bắt lỗi chuẩn của Express](http://expressjs.com/guide/error-handling.html). -Nếu bạn muốn bắt các lỗi cụ thể từ Multer, bạn có thể tự gọi hàm trung gian (middleware) này. Ngoài ra, nếu bạn chỉ muốn bắt [lỗi của Multer](https://github.com/expressjs/multer/blob/master/lib/multer-error.js), bạn có thể dùng class `MulterError` được đính kèm với chính object `multer` (vd: `err instanceof multer.MulterError`). +Nếu bạn muốn bắt các lỗi cụ thể từ Multer, bạn có thể tự gọi hàm trung gian (middleware) này. Ngoài ra, nếu bạn chỉ muốn bắt [lỗi của Multer](https://github.com/expressjs/multer/blob/main/lib/multer-error.js), bạn có thể dùng class `MulterError` được đính kèm với chính object `multer` (vd: `err instanceof multer.MulterError`). ```javascript var multer = require('multer'); @@ -283,16 +283,16 @@ app.post('/profile', function(req, res) { ## Tùy chọn storage engine -Để làm sao tự xây dựng cơ chế lưu file riêng của mình, hãy xem [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md). +Để làm sao tự xây dựng cơ chế lưu file riêng của mình, hãy xem [Multer Storage Engine](https://github.com/expressjs/multer/blob/main/StorageEngine.md). ## License [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer diff --git a/doc/README-zh-cn.md b/doc/README-zh-cn.md index 0ed01dce..31084d1c 100644 --- a/doc/README-zh-cn.md +++ b/doc/README-zh-cn.md @@ -10,12 +10,12 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型 ## 其它语言 -- [العربية](https://github.com/expressjs/multer/blob/master/doc/README-ar.md) (阿拉伯语) -- [English](https://github.com/expressjs/multer/blob/master/README.md) (英语) -- [Español](https://github.com/expressjs/multer/blob/master/doc/README-es.md) (西班牙文) -- [한국어](https://github.com/expressjs/multer/blob/master/doc/README-ko.md) (朝鲜语) -- [Русский язык](https://github.com/expressjs/multer/blob/master/doc/README-ru.md) (俄語) -- [Português](https://github.com/expressjs/multer/blob/master/doc/README-pt-br.md) (巴西葡萄牙语) +- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (阿拉伯语) +- [English](https://github.com/expressjs/multer/blob/main/README.md) (英语) +- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (西班牙文) +- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (朝鲜语) +- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (俄語) +- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (巴西葡萄牙语) ## 安装 @@ -235,7 +235,7 @@ function fileFilter (req, file, cb) { 当遇到一个错误,multer 将会把错误发送给 express。你可以使用一个比较好的错误展示页 ([express标准方式](http://expressjs.com/guide/error-handling.html))。 -如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 [Multer 错误](https://github.com/expressjs/multer/blob/master/lib/multer-error.js),你可以使用 `multer` 对象下的 `MulterError` 类 (即 `err instanceof multer.MulterError`)。 +如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 [Multer 错误](https://github.com/expressjs/multer/blob/main/lib/multer-error.js),你可以使用 `multer` 对象下的 `MulterError` 类 (即 `err instanceof multer.MulterError`)。 ```javascript const multer = require('multer') @@ -262,10 +262,10 @@ app.post('/profile', function (req, res) { [MIT](LICENSE) -[ci-image]: https://badgen.net/github/checks/expressjs/multer/master?label=ci +[ci-image]: https://github.com/expressjs/multer/actions/workflows/ci.yml/badge.svg [ci-url]: https://github.com/expressjs/multer/actions/workflows/ci.yml -[test-url]: https://coveralls.io/r/expressjs/multer?branch=master -[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/master +[test-url]: https://coveralls.io/r/expressjs/multer?branch=main +[test-image]: https://badgen.net/coveralls/c/github/expressjs/multer/main [npm-downloads-image]: https://badgen.net/npm/dm/multer [npm-url]: https://npmjs.org/package/multer [npm-version-image]: https://badgen.net/npm/v/multer From 854d769af40542b28abd5785be6a2818406c8c2a Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Tue, 27 May 2025 03:33:40 -0500 Subject: [PATCH 098/103] deps: update dependencies to latest versions (#1328) --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index e0f7173d..41c67b91 100644 --- a/package.json +++ b/package.json @@ -20,19 +20,19 @@ ], "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "devDependencies": { "deep-equal": "^2.0.3", - "express": "^4.13.1", - "form-data": "^1.0.0-rc1", - "fs-temp": "^1.1.2", - "mocha": "^11.3.0", + "express": "^4.21.2", + "form-data": "^4.0.2", + "fs-temp": "^1.2.1", + "mocha": "^11.5.0", "nyc": "^15.1.0", "rimraf": "^2.4.1", "standard": "^14.3.3", From 061f4cbb2b7bdb803923bb3f1252281f1b89dbb3 Mon Sep 17 00:00:00 2001 From: ctcpip Date: Fri, 23 May 2025 10:57:22 -0500 Subject: [PATCH 099/103] =?UTF-8?q?=F0=9F=93=9D=20list=20languages=20in=20?= =?UTF-8?q?table=20to=20prevent=20GH=20right-aligning=20list=20due=20to=20?= =?UTF-8?q?RTL=20language?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 52fc731d..1e062ee7 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,17 @@ on top of [busboy](https://github.com/mscdex/busboy) for maximum efficiency. This README is also available in other languages: -- [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) (Arabic) -- [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) (Spanish) -- [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) (Chinese) -- [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) (Korean) -- [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) (Russian) -- [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) (Vietnam) -- [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) (Portuguese Brazil) -- [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) (French) -- [O'zbek tili](https://github.com/expressjs/multer/blob/main/doc/README-uz.md) (Uzbek) +| | | +| ------------------------------------------------------------------------------ | --------------- | +| [العربية](https://github.com/expressjs/multer/blob/main/doc/README-ar.md) | Arabic | +| [简体中文](https://github.com/expressjs/multer/blob/main/doc/README-zh-cn.md) | Chinese | +| [Français](https://github.com/expressjs/multer/blob/main/doc/README-fr.md) | French | +| [한국어](https://github.com/expressjs/multer/blob/main/doc/README-ko.md) | Korean | +| [Português](https://github.com/expressjs/multer/blob/main/doc/README-pt-br.md) | Portuguese (BR) | +| [Русский язык](https://github.com/expressjs/multer/blob/main/doc/README-ru.md) | Russian | +| [Español](https://github.com/expressjs/multer/blob/main/doc/README-es.md) | Spanish | +| [O'zbek tili](https://github.com/expressjs/multer/blob/main/doc/README-uz.md) | Uzbek | +| [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) | Vietnamese | ## Installation From f897007a94da404ac9586630dc168c5c30d82512 Mon Sep 17 00:00:00 2001 From: StepSecurity Bot Date: Mon, 2 Jun 2025 03:53:46 -0700 Subject: [PATCH 100/103] ci: apply security best practices (#1311) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ulises Gascón --- .github/dependabot.yml | 15 +++++++++++++++ .github/workflows/ci.yml | 14 +++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..fb6c3102 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + + - package-ecosystem: npm + directory: / + schedule: + interval: monthly + open-pull-requests-limit: 10 + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-major"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6a945e5..b9487c10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,8 +4,14 @@ on: - pull_request - push +permissions: + contents: read + jobs: test: + permissions: + checks: write # for coverallsapp/github-action to create new checks + contents: read # for actions/checkout to fetch code runs-on: ubuntu-latest strategy: fail-fast: false @@ -80,7 +86,7 @@ jobs: node-version: "24" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install Node.js ${{ matrix.node-version }} shell: bash -eo pipefail -l {0} @@ -132,7 +138,7 @@ jobs: fi - name: Collect code coverage - uses: coverallsapp/github-action@v2 + uses: coverallsapp/github-action@09b709cf6a16e30b0808ba050c7a6e8a5ef13f8d # master if: steps.list_env.outputs.nyc != '' with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -140,11 +146,13 @@ jobs: parallel: true coverage: + permissions: + checks: write # for coverallsapp/github-action to create new checks needs: test runs-on: ubuntu-latest steps: - name: Upload code coverage - uses: coverallsapp/github-action@v2 + uses: coverallsapp/github-action@09b709cf6a16e30b0808ba050c7a6e8a5ef13f8d # master with: github-token: ${{ secrets.GITHUB_TOKEN }} parallel-finished: true From 35a3272b611945155e046dd5cef11088587635e9 Mon Sep 17 00:00:00 2001 From: mmoz Date: Tue, 23 Apr 2024 18:33:49 +0300 Subject: [PATCH 101/103] Fixes https://github.com/expressjs/multer/issues/1233. Makes multer handle missing field names. --- lib/make-middleware.js | 2 ++ test/error-handling.js | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/lib/make-middleware.js b/lib/make-middleware.js index 81a90cf6..09b21600 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -101,6 +101,8 @@ function makeMiddleware (setup) { // handle files busboy.on('file', function (fieldname, fileStream, { filename, encoding, mimeType }) { + if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME') + // don't attach to the files object, if there is no file if (!filename) return fileStream.resume() diff --git a/test/error-handling.js b/test/error-handling.js index 6baad5ab..c2b1f973 100644 --- a/test/error-handling.js +++ b/test/error-handling.js @@ -175,6 +175,19 @@ describe('Error Handling', function () { }) }) + it('should notify of missing field name', function (done) { + var form = new FormData() + var storage = multer.memoryStorage() + var parser = multer({ storage: storage }).single('small0') + + form.append('', util.file('small0.dat')) + + util.submitForm(parser, form, function (err, req) { + assert.strictEqual(err.code, 'MISSING_FIELD_NAME') + done() + }) + }) + it('should report errors from storage engines', function (done) { var storage = multer.memoryStorage() From e259a7ee2141f5c89fd3d3e7d6825e706754340e Mon Sep 17 00:00:00 2001 From: ctcpip Date: Mon, 2 Jun 2025 15:48:27 -0500 Subject: [PATCH 102/103] =?UTF-8?q?=F0=9F=94=96=202.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7b5a433..c8dd9f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## 2.0.1 + +- Fix [CVE-2025-48997](https://www.cve.org/CVERecord?id=CVE-2025-48997) ([GHSA-g5hg-p3ph-g8qg](https://github.com/expressjs/multer/security/advisories/GHSA-g5hg-p3ph-g8qg)) + ## 2.0.0 - **Breaking change: The minimum supported Node version is now 10.16.0** diff --git a/package.json b/package.json index 41c67b91..a5d3ac73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "multer", "description": "Middleware for handling `multipart/form-data`.", - "version": "2.0.0", + "version": "2.0.1", "contributors": [ "Hage Yaapa (http://www.hacksparrow.com)", "Jaret Pfluger ", From ace94510b4c1f8f60cdb45e8c5027c7c718a6dc7 Mon Sep 17 00:00:00 2001 From: Ersun Warncke Date: Fri, 7 Dec 2018 05:18:59 -0400 Subject: [PATCH 103/103] allow file upload without filename --- lib/make-middleware.js | 6 ++++-- test/files/no-filename.dat | 11 +++++++++++ test/no-filename.js | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 test/files/no-filename.dat create mode 100644 test/no-filename.js diff --git a/lib/make-middleware.js b/lib/make-middleware.js index 09b21600..dc3483b4 100644 --- a/lib/make-middleware.js +++ b/lib/make-middleware.js @@ -103,8 +103,10 @@ function makeMiddleware (setup) { busboy.on('file', function (fieldname, fileStream, { filename, encoding, mimeType }) { if (fieldname == null) return abortWithCode('MISSING_FIELD_NAME') - // don't attach to the files object, if there is no file - if (!filename) return fileStream.resume() + // filename is not required (https://tools.ietf.org/html/rfc1867) but if + // filename not present busboy only treats as file if content type is + // application/octet-stream + if (!filename) filename = 'undefined' // Work around bug in Busboy (https://github.com/mscdex/busboy/issues/6) if (limits && Object.prototype.hasOwnProperty.call(limits, 'fieldNameSize')) { diff --git a/test/files/no-filename.dat b/test/files/no-filename.dat new file mode 100644 index 00000000..d7b24b7d --- /dev/null +++ b/test/files/no-filename.dat @@ -0,0 +1,11 @@ +--99999 +Content-Disposition: form-data; name="textField" +Content-Type: text/plain; charset=ISO-8859-1 + +foo +--99999 +Content-Disposition: form-data; name="fileField" +Content-Type: application/octet-stream + +foo +--99999-- \ No newline at end of file diff --git a/test/no-filename.js b/test/no-filename.js new file mode 100644 index 00000000..5ed55ced --- /dev/null +++ b/test/no-filename.js @@ -0,0 +1,37 @@ +/* eslint-env mocha */ + +var assert = require('assert') +var fs = require('fs') +var onFinished = require('on-finished') +var path = require('path') + +var multer = require('../') + +describe('File with no filename', function () { + var upload + + before(function () { + upload = multer() + }) + + it('should accept file without filename', function (done) { + var parser = upload.any() + + var filePath = path.join(__dirname, 'files', 'no-filename.dat') + var req = fs.createReadStream(filePath) + req.headers = { + 'content-type': 'multipart/form-data; boundary=99999', + 'content-length': fs.statSync(filePath).size + } + + parser(req, null, function (err) { + onFinished(req, function () { + assert.ifError(err) + assert.equal(req.files.length, 1) + assert.equal(req.files[0].fieldname, 'fileField') + assert.equal(req.files[0].buffer.toString(), 'foo') + done() + }) + }) + }) +})