2015-07-27 13 views
6

Kiedy umieścić wieloczęściowy formularzaKoaJS jak uzyskać pliki z wieloczęściowych danych formularzy?

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

To rzuca:

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

potem zmieniłem kod

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

do

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

żadnego błędu, ale nie mogę uzyskać request'data:

debug(this.request.files.file); 

Wynik jest niezdefiniowany.

Używam KoaJs.

Odpowiedz

0

OK. Przede wszystkim kod, który publikujesz, jest kodem źródłowym z co-body, więc dodanie w multipart/form-data magicznie nie zmusi tego pakietu do obsługi danych wieloczęściowych, jeśli nie został stworzony do tego.

Zamiast używać co-body można użyć co-busboy, który został zbudowany do obsługi multipart/form-data.

1

Dla KOA 2, spróbuj async-busboy do analizowania żądania ciało jako co-busboy nie gra dobrze z async oparciu obietnicy.

przykład z dokumentów:

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) ma [problem generujący ReadStreams] (https://github.com/m4nuC/async-busboy/issues/1), więc nie jest wiarygodne, aby przesłać wiele plików. –

+0

@manakor Ten problem został naprawiony – silkAdmin

0

Spróbuj koa-body bibliotekę.

Przykład:

Umieść ten middleware PRZED middleware Trasa:

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

następnie wykorzystać w middleware trasy

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

Ten kod jest KoaJs 2, ale ta biblioteka współpracuje z KoaJs 1 też.

Powiązane problemy