Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: expressjs/multer
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.4.1
Choose a base ref
...
head repository: expressjs/multer
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.4.2
Choose a head ref
  • 15 commits
  • 6 files changed
  • 8 contributors

Commits on Oct 4, 2018

  1. add Russian translation for README

    Sergei Osipov authored and hcz committed Oct 4, 2018

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    Copy the full SHA
    1c7ae37 View commit details
  2. Russian README fixes

    hcz committed Oct 4, 2018
    Copy the full SHA
    8ba13b0 View commit details

Commits on Oct 12, 2018

  1. Merge pull request #662 from hcz/readme-rus

    add Russian translation for README
    LinusU authored Oct 12, 2018
    Copy the full SHA
    19374b5 View commit details

Commits on Oct 13, 2018

  1. Patch zh-CN README base on newest README. (#670)

    * Patch the README file.
    
    Add link to ko version from zh-CN & en.
    Fix some wording and add description for "preservePath" in zh-CN
    
    * Patch the README file.
    
    Add link to ko version from zh-CN & en.
    Fix some wording and add description for "preservePath" in zh-CN
    
    * Patch  zh-CN README
    PuHsiu authored and LinusU committed Oct 13, 2018
    Copy the full SHA
    b0cd980 View commit details

Commits on Oct 23, 2018

  1. Fix broken link in Readme (#679)

    Fix broken link in Readme
    titoBouzout authored and LinusU committed Oct 23, 2018
    Copy the full SHA
    47b0a1b View commit details

Commits on Apr 11, 2019

  1. Fix broken link in Readme

    HiWangyeah authored Apr 11, 2019
    Copy the full SHA
    3b349bb View commit details
  2. Merge pull request #730 from yepbug/patch-1

    Fix broken link in Chinese Readme
    LinusU authored Apr 11, 2019
    Copy the full SHA
    6d394d3 View commit details

Commits on Apr 17, 2019

  1. Copy the full SHA
    6aebad3 View commit details

Commits on Apr 21, 2019

  1. Fix mistake

    Fix mistake in word "файЛ"
    dzhanavapp authored Apr 21, 2019
    1
    Copy the full SHA
    5c902e5 View commit details

Commits on May 3, 2019

  1. Merge pull request #738 from dzhanavapp/patch-1

    Fix mistake
    LinusU authored May 3, 2019
    Copy the full SHA
    32ec116 View commit details

Commits on Jun 11, 2019

  1. Merge pull request #734 from hcz/hcz-patch-docs

    Add unit for fieldSize in busboy limit params
    LinusU authored Jun 11, 2019
    Copy the full SHA
    122929b View commit details

Commits on Jul 5, 2019

  1. 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.
    Trott committed Jul 5, 2019
    Copy the full SHA
    ac7922b View commit details

Commits on Jul 7, 2019

  1. Merge pull request #752 from Trott/update-testdata-dep

    chore: Update testdata-w3c-json-form
    LinusU authored Jul 7, 2019
    Copy the full SHA
    02ad63c View commit details

Commits on Jul 16, 2019

  1. history: 1.4.2

    LinusU committed Jul 16, 2019
    Copy the full SHA
    67670cd View commit details
  2. version: 1.4.2

    LinusU committed Jul 16, 2019
    Copy the full SHA
    5937690 View commit details
Showing with 302 additions and 23 deletions.
  1. +10 −0 CHANGELOG.md
  2. +3 −2 README.md
  3. +3 −2 doc/README-ko.md
  4. +265 −0 doc/README-ru.md
  5. +19 −17 doc/README-zh-cn.md
  6. +2 −2 package.json
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -11,6 +11,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)

## Installation

@@ -232,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
@@ -270,7 +271,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/make-error.js#L1-L9), 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/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')
5 changes: 3 additions & 2 deletions doc/README-ko.md
Original file line number Diff line number Diff line change
@@ -7,8 +7,9 @@ Multer는 파일 업로드를 위해 사용되는 `multipart/form-data` 를 다
## 번역

이 문서는 아래의 언어로도 제공됩니다:
- [English](../README.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) (러시아)

## 설치

@@ -250,4 +251,4 @@ app.post('/profile', function (req, res) {

## 라이센스

[MIT](LICENSE)
[MIT](LICENSE)
265 changes: 265 additions & 0 deletions doc/README-ru.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
# 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 — это middleware для фреймворка express для обработки `multipart/form-data`, нужная в первую очередь при загрузке файлов. Написана как обертка над [busboy](https://github.com/mscdex/busboy) для ее максимально эффективного использования.

**ВАЖНО**: Multer не обрабатывает никакой другой тип форм, кроме `multipart/form-data`.

## Переводы

Это README также доступно на других языках:

- [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) (Корейский)

## Установка

```sh
$ npm install --save multer
```

## Использование

Multer добавляет объект `body` и объект `file` (или `files`) внутрь объекта `request`. Объект `body` содержит значения текстовых полей формы, объект `file` (`files`) содержит файл или файлы, загружаемые через форму.

Простой пример использования:

Не забывайте про `enctype="multipart/form-data"` в вашей форме.

```html
<form action="/profile" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" />
</form>
```

```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 - файл `avatar`
// req.body сохранит текстовые поля, если они будут
})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
// req.files - массив файлов `photos`
// req.body сохранит текстовые поля, если они будут
})

var 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 - ключ, и значение - массив файлов
//
// например:
// req.files['avatar'][0] -> File
// req.files['gallery'] -> Array
//
// req.body сохранит текстовые поля, если они будут
})
```

Если вам нужно обработать multipart-форму, содержащую только текст, используйте метод `.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 содержит текстовые поля
})
```

## API

### Информация о файлах

Каждый файл содержит следующую информацию:

Ключ | Описание | Замечания
--- | --- | ---
`fieldname` | Имя поля, заданное в форме |
`originalname` | Имя файла на компьютере пользователя |
`encoding` | Кодировка файла |
`mimetype` | Mime-тип файла |
`size` | Размер файла в байтах |
`destination` | Каталог, где будет сохранен файл | `DiskStorage`
`filename` | Имя файла без `destination` | `DiskStorage`
`path` | Полный путь к загружаемому файлу | `DiskStorage`
`buffer` | `Buffer` из всего файла | `MemoryStorage`

### `multer(opts)`

Multer принимает объект с опциями. Базовая опция `dest` указывает Multer, куда загружать файлы. Если вы не указываете объект с опциями, файлы будут находиться в памяти и не будут записаны на диск.

По умолчанию, Multer переименовывает файлы, чтобы избежать конфликтов. Это настраиваемо под ваши потребности.

Следующие опции могут быть переданы Multer.

Ключ | Описание
--- | ---
`dest` или `storage` | Где сохранять файлы
`fileFilter` | Функция для контроля принятия файлов
`limits` | Ограничения по загрузке
`preservePath` | Сохранять полный путь к файлам вместо только базового имени

Обычно для веб-приложения нужно обязательно переопределить `dest`, как показано в примере ниже.

```javascript
var upload = multer({ dest: 'uploads/' })
```
Если вам нужно больше возможностей для управления приложением, можно использовать `storage` вместо `dest`. Multer поставляется с двумя движками работы с памятью, `DiskStorage` и `MemoryStorage`, другие движки можно найти у сторонних разработчиков.

#### `.single(fieldname)`

Принимает один файл с именем `fieldname`. Файл будет сохранен в `req.file`.

#### `.array(fieldname[, maxCount])`

Принимает массив файлов с именем `fieldname`. Опционально можно задать ошибку при попытке загрузки более `maxCount` файлов. Массив файлов будет сохранен в `req.files`.

#### `.fields(fields)`

Принимает набор файлов, определенных в `fields`. Объект с массивом файлов будет сохранен в `req.files`.

`fields` должен быть массивом объектов с полями `name` и опциональным `maxCount`.
Например:

```javascript
[
{ name: 'avatar', maxCount: 1 },
{ name: 'gallery', maxCount: 8 }
]
```

#### `.none()`

Принимает только текстовые поля формы. При попытке загрузки файла падает с ошибкой "LIMIT\_UNEXPECTED\_FILE".

#### `.any()`

Принимает все переданные файлы. Массив файлов будет сохранен в `req.files`.

**ПРЕДУПРЕЖДЕНИЕ:** Убедитесь в корректной обработке загрузки файлов вашим приложением. Никогда не используйте Multer как middleware глобально, если пользователь может загрузить вредоносные файлы, и тем самым нарушить работу вашего приложения. Используйте этот метод, только если вы полностью управляете процессом загрузки файлов.

### `storage`

#### `DiskStorage`

Движок дискового пространства. Дает полный контроль над размещением файлов на диск.

```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 })
```

Доступно две опции, расположение `destination` и имя файла `filename`. Обе эти функции определяют, где будет находиться файл после загрузки.

`destination` используется, чтобы задать каталог, в котором будут размещены файлы. Может быть задан строкой (например, `'/tmp/uploads'`). Если не задано расположение `destination`, операционная система воспользуется для сохранения каталогом для временных файлов.

**Важно:** Вы должны создать каталог, когда используете `destination`. При передачи в качестве аргумента строки, Multer проверяет, что каталог создан.

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

**Важно:** Multer не добавляет никакого файлового расширения, ваша функция должна возвращать имя файла с необходимым расширением.

В аргументах каждой функции прокидывается запрос (`req`) и набор информации о файле (`file`).

Обратите внимание, что `req.body` может быть не полностью заполнено. Это зависит от порядка отправки клиентом полей и файлов на сервер.

#### `MemoryStorage`

Движок оперативной памяти сохраняет файлы в памяти как объекты типа `Buffer`. В этом случае нет никаких дополнительных опций.

```javascript
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
```
Когда вы используете этот тип передачи, информация о файле будет содержать поле `buffer`, которое содержит весь файл.

**ПРЕДУПРЕЖДЕНИЕ**: Загрузка очень больших файлов, или относительно небольших файлов в большом количестве может вызвать переполнение памяти.

### `limits`

Объект, устанавливающий ограничения. Multer прокидывает этот объект напрямую в busboy, поэтому детали можно посмотреть
[на странице с методами busboy](https://github.com/mscdex/busboy#busboy-methods).

Доступны следующие целочисленные значения:

Ключ | Описание | Значение по умолчанию
--- | --- | ---
`fieldNameSize` | Максимальный размер имени файла | 100 bytes
`fieldSize` | Максимальный размер значения поля | 1MB
`fields` | Максимальное количество не-файловых полей | Не ограничено
`fileSize` | Максимальный размер файла в байтах для multipart-форм | Не ограничен
`files` | Максимальное количество полей с файлами для multipart-форм | Не ограничено
`parts` | Максимальное количество полей с файлами для multipart-форм (поля плюс файлы) | Не ограничено
`headerPairs` | Максимальное количество пар ключ-значение key=>value для multipart-форм, которое обрабатывается | 2000

Установка ограничений может помочь защитить ваш сайт от DoS-атак.

### `fileFilter`

Задает функцию для того, чтобы решать, какие файлы должны быть загружены, а какие — нет. Функция может выглядет так:

```javascript
function fileFilter (req, file, cb) {

// Функция должна вызывать `cb` с булевым значением,
// которое показывает, следует ли принять файл

// Чтобы отклонить, прокиньте в аргументы `false` так:
cb(null, false)

// Чтобы принять файл, используется как аргумент `true` таким образом:
cb(null, true)

// Вы можете всегда вернуть ошибку, если что-то пошло не так:
cb(new Error('I don\'t have a clue!'))

}
```

## Обработка ошибок

Когда выбрасывается исключение, 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`)

```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) {
// Случилась ошибка Multer при загрузке.
} else {
// При загрузке произошла неизвестная ошибка.
}

// Все прекрасно загрузилось.
})
})
```

## Собственные движки для сохранения файлов

Чтобы получить информацию, как создать собственный движок для обработки загрузки файлов, смотрите страницу [Multer Storage Engine](https://github.com/expressjs/multer/blob/master/StorageEngine.md).

## Лицензия

[MIT](LICENSE)
36 changes: 19 additions & 17 deletions doc/README-zh-cn.md
Original file line number Diff line number Diff line change
@@ -10,8 +10,9 @@ Multer 是一个 node.js 中间件,用于处理 `multipart/form-data` 类型

## 其它语言

- [English](../README.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) (俄語)

## 安装

@@ -55,15 +56,15 @@ app.post('/cool-profile', cpUpload, function (req, res, next) {
})
```

如果你需要处理一个只有文本域的表单,你可以使用任何一个 multer 方法 (`.single()`, `.array()`, `fields()`). 下面是一个使用 `.array()` 的例子:
如果你需要处理一个只有文本域的表单,你应当使用 `.none()`:

```javascript
var express = require('express')
var app = express()
var multer = require('multer')
var upload = multer()

app.post('/profile', upload.array(), function (req, res, next) {
app.post('/profile', upload.none(), function (req, res, next) {
// req.body 包含文本域
})
```
@@ -101,8 +102,7 @@ Key | Description
`limits` | 限制上传的数据
`preservePath` | 保存包含文件名的完整文件路径

通常,只需要设置 `dest` 属性
像这样:
通常,一般的网页应用,只需要设置 `dest` 属性,像这样:

```javascript
var upload = multer({ dest: 'uploads/' })
@@ -139,14 +139,14 @@ Example:

#### `.any()`

接受一切。文件数组将保存在 `req.files`
接受一切上传的文件。文件数组将保存在 `req.files`

**警告:** 确保你总是处理了用户的文件上传。
永远不要将 multer 作为全局中间件使用,因为恶意用户可以上传文件到一个你没有预料到的路由,应该只在你需要处理上传文件的路由上使用。

### `storage`

#### `DiskStorage`
#### 磁盘存储引擎 (`DiskStorage`)

磁盘存储引擎可以让你控制文件的存储。

@@ -165,21 +165,21 @@ var upload = multer({ storage: storage })

有两个选项可用,`destination``filename`。他们都是用来确定文件存储位置的函数。

`destination` 是用来确定上传的文件应该存储在哪个文件夹中。也可以提供一个 `string` (例如 `'/tmp/uploads'`)。如果没有设置 `destination`则使用操作默认的临时文件夹
`destination` 是用来确定上传的文件应该存储在哪个文件夹中。也可以提供一个 `string` (例如 `'/tmp/uploads'`)。如果没有设置 `destination`则使用操作系统默认的临时文件夹。

**注意:** 如果你提供的 `destination` 是一个函数,你需要负责创建文件夹。当提供一个字符串,multer 将确保这个文件夹是你创建的。

`filename` 用于确定文件夹中的文件名的确定。 如果没有设置 `filename`,每个文件将设置为一个随机文件名,并且是没有扩展名的
`filename` 用于确定文件夹中的文件名的确定。 如果没有设置 `filename`,每个文件将设置为一个随机文件名,并且是没有扩展名的

**注意:** Multer 不会为你添加任何扩展名,你的程序应该返回一个完整的文件名。

每个函数都传递了两个请求 (`req`) 和一些关于这个文件的信息 (`file`) 有助于你的决定。
每个函数都传递了请求对象 (`req`) 和一些关于这个文件的信息 (`file`)有助于你的决定。

注意 `req.body` 可能还没有完全填充,这取决于向客户端发送字段和文件到服务器的顺序。

#### `MemoryStorage`
#### 内存存储引擎 (`MemoryStorage`)

内存存储引擎将文件存储在内存中的 `Buffer` 对象,它没有任何选项
内存存储引擎将文件存储在内存中的 `Buffer` 对象,它没有任何选项

```javascript
var storage = multer.memoryStorage()
@@ -188,7 +188,7 @@ var upload = multer({ storage: storage })

当使用内存存储引擎,文件信息将包含一个 `buffer` 字段,里面包含了整个文件数据。

**警告**: 当你使用内存存储,上传非常大的文件,或者非常多的小文件,会导致你的应用程序内存溢出
**警告**: 当你使用内存存储,上传非常大的文件,或者非常多的小文件,会导致你的应用程序内存溢出

### `limits`
一个对象,指定一些数据大小的限制。Multer 通过这个对象使用 busboy,详细的特性可以在 [busboy's page](https://github.com/mscdex/busboy#busboy-methods) 找到。
@@ -205,7 +205,7 @@ Key | Description | Default
`parts` | 在 multipart 表单中,part 传输的最大数量(fields + files) | 无限
`headerPairs` | 在 multipart 表单中,键值对最大组数 | 2000

设置 limits 可以帮助保护你的站点免受拒绝服务 (DoS) 攻击。
设置 limits 可以帮助保护你的站点抵御拒绝服务 (DoS) 攻击。

### `fileFilter`
设置一个函数来控制什么文件可以上传以及什么文件应该跳过,这个函数应该看起来像这样:
@@ -232,16 +232,18 @@ function fileFilter (req, file, cb) {

当遇到一个错误,multer 将会把错误发送给 express。你可以使用一个比较好的错误展示页 ([express标准方式](http://expressjs.com/guide/error-handling.html))。

如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。
如果你想捕捉 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')

app.post('/profile', function (req, res) {
upload(req, res, function (err) {
if (err) {
if (err instanceof multer.MulterError) {
// 发生错误
} else if (err) {
// 发生错误
return
}

// 一切都好
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "multer",
"description": "Middleware for handling `multipart/form-data`.",
"version": "1.4.1",
"version": "1.4.2",
"contributors": [
"Hage Yaapa <captain@hacksparrow.com> (http://www.hacksparrow.com)",
"Jaret Pfluger <https://github.com/jpfluger>",
@@ -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"