form的方法

  1. let form = new formidable.IncomingForm();
  2. console.log(formidable.IncomingForm.prototype);

formidable - 图1

基本使用

  1. 可以设置 form 的属性,如 maxFields

  2. 可以获取 file 的属性,如 file.size

  3. 通过给 form.parse传递回调,可以在解析完成后获得 fieldsfile

  1. let form = new formidable.IncomingForm();
  2. console.log(form);
  3. form.parse(req, (err, fields, files) => {
  4. console.log(fields);
  5. console.log(files);
  6. });

formidable - 图2

监听解析过程中的事件

  1. let form = new formidable.IncomingForm();
  2. form.on('progress', function(bytesReceived, bytesExpected) {
  3. // 开始解析上传的文件流时触发
  4. });
  5. form.on('fileBegin', function(name, file) {
  6. // 当检测到一个新的文件上传时触发
  7. });
  8. form.on('field', (field, value) => {
  9. // field 为input的name,value 是值
  10. });
  11. form.on('file', (name, file) => {
  12. // name 是文件的名字, file是文件对象
  13. });
  14. form.on('error', (err) => {});
  15. form.on('aborted', () => {});
  16. form.on('end', () => {});
  17. // 必须调用form.parse
  18. form.parse(req);

自定义处理方式

可以重写 form.onPart 方法,来自定义每一部分的处理方式。
每一个表单项或文件就是一个part

  1. form.onPart = function(part) {
  2. console.log(part);
  3. // 每一个表单项或者文件就是一个part
  4. Stream {
  5. domain: null,
  6. _events: {},
  7. _eventsCount: 0,
  8. _maxListeners: undefined,
  9. readable: true,
  10. headers:
  11. { 'content-disposition': 'form-data; name="file"; filename="2.png"',
  12. 'content-type': 'image/png' },
  13. name: 'file',
  14. filename: '2.png',
  15. mime: 'image/png',
  16. transferEncoding: 'binary',
  17. transferBuffer: '' }
  18. }

可以针对不同的part做不同的处理。

  1. form.onPart = function (part) {
  2. console.log(part);
  3. if (!part.mime) {
  4. form.handlePart(part);
  5. } else {
  6. part.on('data', (data) => {
  7. res.write(data);
  8. });
  9. }
  10. part.on('end', () => {
  11. // res.end(result);
  12. });
  13. }
  14. form.parse(req);