@@ -178,34 +178,37 @@ class HttpController extends Controller {
178
178
179
179
当一个表单提交包含文件的时候,请求数据格式就必须以 [ multipart/form-data] ( http://tools.ietf.org/html/rfc2388 ) 进行提交了。
180
180
181
- 此时需要引入 [ formstream] 模块来帮助我们生成可以被消费的 ` form ` 对象。
181
+ [ urllib ] 内置了 [ formstream] 模块来帮助我们生成可以被消费的 ` form ` 对象。
182
182
183
183
关键配置为:
184
184
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 ` 。
187
189
188
190
``` js
189
191
// app/controller/http.js
190
- const FormStream = require (' formstream' );
191
-
192
192
class HttpController extends Controller {
193
193
async upload () {
194
194
const { ctx } = this ;
195
195
196
- const form = new FormStream ();
197
- // 设置普通的 key value
198
- form .field (' foo' , ' bar' );
199
- // 上传当前文件本身用于测试,可以执行多次来添加多个文件
200
- form .file (' file' , __filename );
201
-
202
196
const result = await ctx .curl (' https://httpbin.org/post' , {
203
197
method: ' POST' ,
204
- // 生成符合 multipart/form-data 要求的请求 headers
205
- headers: form .headers (),
206
- // 以 stream 模式提交
207
- stream: form,
208
198
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
+ // },
209
212
});
210
213
211
214
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
});
714
717
```
715
718
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
+
716
749
### ` stream: ReadStream `
717
750
718
751
设置发送请求正文的可读数据流,一旦设置了此参数,将会忽略 ` data ` 和 ` content ` 。
0 commit comments