KoaJS, how to get files from multi-page form data?

When I submit a multi-part form,

<form name="acount_manage" action="/update" enctype="multipart/form-data" method="post"> <input type="file" name="file"> </form> 

He throws out:

 Error: Unsupported content-type: multipart/form-data at Object.<anonymous> (e:\...\node_modules\co-body\lib\any.js:51:15) 

any.js:

 /** * Module dependencies. */ var json = require('./json'); var form = require('./form'); var text = require('./text'); var JSON_CONTENT_TYPES = [ 'application/json', 'application/json-patch+json', 'application/vnd.api+json', 'application/csp-report', 'application/ld+json' ]; /** * Return aa thunk which parses form and json requests * depending on the Content-Type. * * Pass a node request or an object with `.req`, * such as a koa Context. * * @param {Request} req * @param {Options} [opts] * @return {Function} * @api public */ module.exports = function(req, opts){ req = req.req || req; // parse Content-Type var type = req.headers['content-type'] || ''; type = type.split(';')[0]; // json if (~JSON_CONTENT_TYPES.indexOf(type)) return json(req, opts); // form if ('application/x-www-form-urlencoded' == type) return form(req, opts); // text if ('text/plain' == type) return text(req, opts); // invalid return function(done){ var message = type ? 'Unsupported content-type: ' + type : 'Missing content-type'; var err = new Error(message); err.status = 415; done(err); }; }; 

then i changed the code

 if ('application/x-www-form-urlencoded' == type) return form(req, opts); 

to

 if ('application/x-www-form-urlencoded' == type || 'multipart/form-data'==type) return form(req, opts); 

there is no error, but I can not get the request data:

 debug(this.request.files.file); 

The result is undefined.

I am using KoaJs.

+6
source share
3 answers

For koa 2, try async-busboy to parse the request body as co-busboy does not work very well with an asynchronous promise.

Example from the docs:

 import asyncBusboy from 'async-busboy'; // Koa 2 middleware async function(ctx, next) { const {files, fields} = await asyncBusboy(ctx.req); // Make some validation on the fields before upload to S3 if ( checkFiles(fields) ) { files.map(uploadFilesToS3) } else { return 'error'; } } 
+1
source

Try the koa-body library.

Example:

Put this middleware BEFORE THE SEQUENTIAL FOLLOWING route:

 app.use(require('koa-body')({ formidable:{ uploadDir: __dirname + '/public/uploads', // directory where files will be uploaded keepExtensions: true // keep file extension on upload }, multipart: true, urlencoded: true, })); 

Then use in the middleware route

 async function(ctx, next) { ctx.request.body.files.file // file is the input name } 

This code is for KoaJs 2, but this library also works with KoaJs 1.

+1
source

Good. First of all, the code you publish is the source code from co-body , so adding to multipart/form-data does not magically force this package to process the data of several parts if it was not created for this.

Instead of co-body, you can use co-busboy , which was created to handle multipart/form-data .

0
source

All Articles