以下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}`)
})
答案 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)