使用 Deno 和 Oak 处理 multipart/form-data
Handling multipart/form-data with Deno and Oak
我在学习 Deno 和 Oak 方面进展缓慢但稳定,但这让我感到难过。我有一个带有文件上传字段的简单 Web 表单:
<form method="post" action="/quote" enctype="multipart/form-data">
<label>Author:
<input type="text" name="author" />
</label>
<label>file: <input type="file" name="myfile" multiple />
</label>
<label>Quote:
<textarea name="quote"></textarea>
</label>
<input type="submit" />
</form>
处理是用 Deno 和 Oak 完成的,这里是处理文本数据的脚本:
router.post('/quote', async context => {
const body = context.request.body({ type: 'form' })
const value = await body.value
const author = value.get('author')
console.log(author)
context.response.redirect(`/?author=${author}`)
})
路由可以处理 not 编码为 multipart/form-data
的表单,但只要我添加它,author
字段就是 undefined
.
我的问题是:如何访问此表单中的数据(文本和文件数据)?
router.post('/quote', async context => {
let params: {[key: string]: string} = {};
let value: any = await context.request.body().value;
for (const [key, valor] of value) {
params[key] = valor;
}
const author = params['author']
console.log(author)
context.response.redirect(`/?author=${author}`)
})
解决方案埋在Oak documentation。 Context
对象的Request
属性包含一个body()
方法。这“解析为请求主体的一个版本”。
它需要一个实现 BodyOptions
接口的 options
对象。它有一个名为 type
的单个 属性,如果您打算解析 multipart/form-data
.
,则它的值需要为 form-data
在这种情况下,它 returns 一个实现 FormDataReader
接口的对象,它包括一个 read()
方法,该方法解析为一个包含来自 all 的数据的对象表单字段,包括上传的任何文件。
下面是一个如何实施的例子:
router.post('/foo', async context => {
const body = await context.request.body({ type: 'form-data'})
const data = await body.value.read()
console.log(data)
context.response.redirect('/')
})
这是一个输出示例。它包括一个 fields
属性,其中包含来自表单字段的数据和一个 files
数组,其中包含您上传的所有文件的数据:
{
fields: { name: "Foo", organisation: "Bar" },
files: [
{
content: undefined,
contentType: "image/png",
name: "myimage",
filename: "/tmp/c8290ba0/e25ee9648e3e5db57f5ef3eb4cfa06704ce5f29c.png",
originalName: "foobar.png"
}
]
}
我在学习 Deno 和 Oak 方面进展缓慢但稳定,但这让我感到难过。我有一个带有文件上传字段的简单 Web 表单:
<form method="post" action="/quote" enctype="multipart/form-data">
<label>Author:
<input type="text" name="author" />
</label>
<label>file: <input type="file" name="myfile" multiple />
</label>
<label>Quote:
<textarea name="quote"></textarea>
</label>
<input type="submit" />
</form>
处理是用 Deno 和 Oak 完成的,这里是处理文本数据的脚本:
router.post('/quote', async context => {
const body = context.request.body({ type: 'form' })
const value = await body.value
const author = value.get('author')
console.log(author)
context.response.redirect(`/?author=${author}`)
})
路由可以处理 not 编码为 multipart/form-data
的表单,但只要我添加它,author
字段就是 undefined
.
我的问题是:如何访问此表单中的数据(文本和文件数据)?
router.post('/quote', async context => {
let params: {[key: string]: string} = {};
let value: any = await context.request.body().value;
for (const [key, valor] of value) {
params[key] = valor;
}
const author = params['author']
console.log(author)
context.response.redirect(`/?author=${author}`)
})
解决方案埋在Oak documentation。 Context
对象的Request
属性包含一个body()
方法。这“解析为请求主体的一个版本”。
它需要一个实现 BodyOptions
接口的 options
对象。它有一个名为 type
的单个 属性,如果您打算解析 multipart/form-data
.
form-data
在这种情况下,它 returns 一个实现 FormDataReader
接口的对象,它包括一个 read()
方法,该方法解析为一个包含来自 all 的数据的对象表单字段,包括上传的任何文件。
下面是一个如何实施的例子:
router.post('/foo', async context => {
const body = await context.request.body({ type: 'form-data'})
const data = await body.value.read()
console.log(data)
context.response.redirect('/')
})
这是一个输出示例。它包括一个 fields
属性,其中包含来自表单字段的数据和一个 files
数组,其中包含您上传的所有文件的数据:
{
fields: { name: "Foo", organisation: "Bar" },
files: [
{
content: undefined,
contentType: "image/png",
name: "myimage",
filename: "/tmp/c8290ba0/e25ee9648e3e5db57f5ef3eb4cfa06704ce5f29c.png",
originalName: "foobar.png"
}
]
}