0

当提交多个上传时,以下 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}`)
})
4

2 回答 2

1

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

您应该能够通过添加Joi有效负载验证来告诉 Hapi 如何明确解释它。就像是:

config: {
    payload: {
        output: 'stream',
        parse: true,
        allow: 'multipart/form-data'
    },
    validate: {
        payload: Joi.object({
            files: Joi.array().single()
        })
    }
},
于 2017-06-09T14:11:58.790 回答
0

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

const p = request.payload, files = [].concat(p.files)
于 2017-07-01T20:04:13.960 回答