Skip to content

Commit 069fa07

Browse files
authored
feat: httpclient upload files (#5)
1 parent 321248d commit 069fa07

File tree

1 file changed

+48
-15
lines changed

1 file changed

+48
-15
lines changed

docs/zh/guide/httpclient.md

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -178,34 +178,37 @@ class HttpController extends Controller {
178178

179179
当一个表单提交包含文件的时候,请求数据格式就必须以 [multipart/form-data](http://tools.ietf.org/html/rfc2388) 进行提交了。
180180

181-
此时需要引入 [formstream] 模块来帮助我们生成可以被消费的 `form` 对象。
181+
[urllib] 内置了 [formstream] 模块来帮助我们生成可以被消费的 `form` 对象。
182182

183183
关键配置为:
184184

185-
- `stream: form`:通过 `Stream` 模式发送数据。
186-
- `headers: form.headers()`:传递符合 `multipart/form-data` 要求的请求头。
185+
- `files`:需要上传的文件,支持多种形式:
186+
- 单文件上传:支持直接传递:String 文件路径 / Stream 对象 / Buffer 对象。
187+
- 多文件上传:数组或 Object 格式,若为后者,则 key 为对应的 fieldName。
188+
- `data`:将被转换为对应的 `form field`
187189

188190
```js
189191
// app/controller/http.js
190-
const FormStream = require('formstream');
191-
192192
class HttpController extends Controller {
193193
async upload() {
194194
const { ctx } = this;
195195

196-
const form = new FormStream();
197-
// 设置普通的 key value
198-
form.field('foo', 'bar');
199-
// 上传当前文件本身用于测试,可以执行多次来添加多个文件
200-
form.file('file', __filename);
201-
202196
const result = await ctx.curl('https://httpbin.org/post', {
203197
method: 'POST',
204-
// 生成符合 multipart/form-data 要求的请求 headers
205-
headers: form.headers(),
206-
// 以 stream 模式提交
207-
stream: form,
208198
dataType: 'json',
199+
data: {
200+
foo: 'bar',
201+
},
202+
203+
// 单文件上传
204+
files: __filename,
205+
206+
// 多文件上传
207+
// files: {
208+
// file1: __filename,
209+
// file2: fs.createReadStream(__filename),
210+
// file3: Buffer.from('mock file content'),
211+
// },
209212
});
210213

211214
ctx.body = result.data.files;
@@ -713,6 +716,36 @@ ctx.curl(http://github.com/url,%20%7B%3C/div%3E%3C/code%3E%3C/div%3E%3C/td%3E%3C/tr%3E%3Ctr%20class=%22diff-line-row%22%3E%3Ctd%20data-grid-cell-id=%22diff-d076833aff7208fb91d42e66c57c564e4222719c827b541b9eff7b036c34113c-713-716-0%22%20data-selected=%22false%22%20role=%22gridcell%22%20style=%22background-color:var(--bgColor-default);text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative diff-line-number-neutral left-side">713
716
});
714717
```
715718

719+
### `files: Mixed`
720+
721+
文件上传,支持格式: `String | ReadStream | Buffer | Array | Object`
722+
723+
```js
724+
ctx.curl(url, {
725+
method: 'POST',
726+
files: '/path/to/read',
727+
data: {
728+
foo: 'other fields',
729+
},
730+
});
731+
```
732+
733+
多文件上传:
734+
735+
```js
736+
ctx.curl(url, {
737+
method: 'POST',
738+
files: {
739+
file1: '/path/to/read',
740+
file2: fs.createReadStream(__filename),
741+
file3: Buffer.from('mock file content'),
742+
},
743+
data: {
744+
foo: 'other fields',
745+
},
746+
});
747+
```
748+
716749
### `stream: ReadStream`
717750

718751
设置发送请求正文的可读数据流,一旦设置了此参数,将会忽略 `data``content`

0 commit comments

Comments
 (0)