如何在Hapi.js中处理多个上传

时间:2017-03-07 01:03:13

标签: bash curl file-upload hapi.js

以下index.js在提交多个上传时工作正常  用:

curl http://localhost:4000/upload -F 'files=@data/file1.txt' -F
'files=@data/file2.txt'

但如果只提交了一个文件,它就会失败:

curl http://localhost:4000/upload -F 'files=@data/file1.txt'

因为hapi期望files是一个数组。

如果我使用files[]代替

,它就无效
curl http://localhost:4000/upload -F 'files[]=@data/file1.txt'

我可以通过检查index.js是否files是否为数组来解决此问题,如果不是,我只需用 [files] 包装它,以便剩下的代码不会破坏,但我觉得解决方案并不那么优雅。这是hapi.js文件上传处理中的限制/错误吗?

/* index.js */
const Hapi = require('hapi')
const server = new Hapi.Server()
server.connection({
    port:4000
})

const routes = [
    {
        path: '/upload',
        method: 'POST',
        config: {
            payload: {
                output: 'stream',
                parse: true,
                allow: 'multipart/form-data'
            }
        },
        handler: function(request, reply) {
            const p = request.payload, files = p.files
            if(files) {
                console.log(`${files.length} files`)
                files.forEach(function(file) {
                    // do something with file here
                })
            }
            return reply({result: 'ok'})
        }
    }
]

server.route(routes)

server.start(function() {
    console.log(`server started at ${server.info.uri}`)
})

2 个答案:

答案 0 :(得分:1)

实际上,Hapi将无法判断files元素是否为数组,除非它可以从请求中的多次使用中推断它。

您应该能够通过添加Joi有效负载验证来告诉Hapi如何明确解释它。类似的东西:

config: {
    payload: {
        output: 'stream',
        parse: true,
        allow: 'multipart/form-data'
    },
    validate: {
        payload: Joi.object({
            files: Joi.array().single()
        })
    }
},

答案 1 :(得分:0)

我刚刚发现它确实很容易通过使用这种技术确保文件始终是一个数组:

const p = request.payload, files = [].concat(p.files)