2015-07-27 1 views
6

Когда я отправляю многослойную форму,KoaJS, как получить файлы из данных многострочной формы?

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

Он бросает:

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 a a 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); 
 
    }; 
 
};

Затем я изменил код

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

в

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

ошибки нет, но я не могу получить request'data:

debug(this.request.files.file); 

Результат не определен.

Я использую KoaJs.

ответ

0

Хорошо. Прежде всего, код, который вы публикуете, является исходным кодом от co-body, поэтому добавление в multipart/form-data не волшебным образом приведет к тому, что этот пакет обработает данные нескольких частей, если он не был создан для этого.

Вместо использования co-body вы можете использовать co-busboy, который был построен для обработки multipart/form-data.

1

Для КоА 2, попробуйте async-busboy разобрать тело запроса, как co-busboy не очень хорошо играть с асинхронным на основе обещания.

Пример из документации:

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'; 
    } 
} 
+0

[async-busboy] (https://github.com/m4nuC/async-busboy) имеет [выпуск генерирующих ReadStreams] (https://github.com/m4nuC/async-busboy/issues/1), поэтому он не является надежным для загрузки нескольких файлов. –

+0

@manakor Эта проблема исправлена – silkAdmin

0

Попробуйте koa-body библиотеку.

Пример:

Поместите это промежуточное программное обеспечение ДО маршрут промежуточного слоя:

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, 
})); 

Затем использовать в маршрутном промежуточном

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

Этот код для KoaJs 2, но эта библиотека работает с KoaJs 1 тоже.