Bash 如何在Hapi.js中处理多次上传
当提交多个上传时,以下index.js可以正常工作 与: 但如果只提交一个文件,则会失败:Bash 如何在Hapi.js中处理多次上传,bash,curl,file-upload,hapi.js,Bash,Curl,File Upload,Hapi.js,当提交多个上传时,以下index.js可以正常工作 与: 但如果只提交一个文件,则会失败: curl http://localhost:4000/upload -F 'files=@data/file1.txt' 因为hapi希望文件是数组 也就是说,如果我使用files[]来代替,它也不起作用 curl http://localhost:4000/upload -F 'files[]=@data/file1.txt' 我可以通过在index.js中检查文件是否是数组来解决这个问题,如果不是
curl http://localhost:4000/upload -F 'files=@data/file1.txt'
因为hapi希望文件是数组
也就是说,如果我使用files[]来代替,它也不起作用
curl http://localhost:4000/upload -F 'files[]=@data/file1.txt'
我可以通过在index.js中检查文件是否是数组来解决这个问题,如果不是,我就用[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}`)
})
事实上,Hapi无法判断files元素是否是数组,除非它可以从一个请求中的多次使用中推断出来 您应该能够通过添加有效负载验证来告诉Hapi如何显式解释它。比如:
config: {
payload: {
output: 'stream',
parse: true,
allow: 'multipart/form-data'
},
validate: {
payload: Joi.object({
files: Joi.array().single()
})
}
},
我刚刚发现,通过使用以下技术,确保文件始终是一个数组实际上非常容易:
const p = request.payload, files = [].concat(p.files)
不知道单一的、伟大的用例。我已经试过你的建议了,它很有魅力。谢谢
const p = request.payload, files = [].concat(p.files)