文件上传
AdonisJS 为你提供了一个处理文件上传的的 API。你不仅可以在本地处理、存储上传的文件,而且还可以将它们直接上传至云服务,比如S3、Cloudinary 或 谷歌云。
访问上传的文件
在start/kernel.ts
文件内注册的 bodyparser 中间件会自动处理所有multipart/form-data
请求的文件。
你可以使用request.file
方法访问这些文件。该方法接受字段名并返回一个 File 类的实例,如果没有上传文件,则返回 null
。
import Route from '@ioc:Adonis/Core/Route'
import Application from '@ioc:Adonis/Core/Application'
Route.post('posts', async ({ request }) => {
const coverImage = request.file('cover_image')
if (coverImage) {
await coverImage.move(Application.tmpPath('uploads'))
}
})
当上传多个文件时,你可以使用request.files
方法得到一个文件实例的数组。
import Route from '@ioc:Adonis/Core/Route'
import Application from '@ioc:Adonis/Core/Application'
Route.post('gallery', async ({ request }) => {
const images = request.files('images')
for (let image of images) {
await image.move(Application.tmpPath('uploads'))
}
})
验证文件
你可以通过指定文件扩展名或文件大小来验证文件,AdonisJS 将隐式地执行验证。
注:
我们会尝试使用文件的 magic number 判断文件类型,如果在无法使用 magic number 检测时将使用文件的扩展名。
const coverImage = request.file('cover_image', {
size: '2mb',
extnames: ['jpg', 'png', 'gif'],
})
if (!coverImage) {
return
}
if (!coverImage.isValid) {
return coverImage.errors
}
await coverImage.move(Application.tmpPath('uploads'))
使用验证器验证文件
你可以使用 validator(验证器) 来验证表单和上传的文件。
schema.file
方法用于验证输入是不是有效的文件,以及为文件大小和扩展名提供的任何自定义的验证规则。
当文件验证失败时,你可以访问包含了表单错误的错误消息。验证通过后,你可以访问文件的实例并将其移到所需的位置。
import Route from '@ioc:Adonis/Core/Route'
import { schema } from '@ioc:Adonis/Core/Validator'
import Application from '@ioc:Adonis/Core/Application'
Route.post('posts', async ({ request }) => {
const postSchema = schema.create({
cover_image: schema.file({
size: '2mb',
extnames: ['jpg', 'gif', 'png'],
}),
})
const payload = await request.validate({ schema: postSchema })
await payload.cover_image.move(Application.tmpPath('uploads'))
})
保存文件
你可以使用moveToDisk
方法保存上传的文件。 它在内部使用 AdonisJS 的 Drive(驱动器) 来保存文件。
const coverImage = request.file('cover_image', {
size: '2mb',
extnames: ['jpg', 'png', 'gif'],
})!
// 高亮开始
await coverImage.moveToDisk('./')
// 获取保存文件的名称;例如,将其存储在您的数据库中。
const fileName = coverImage.fileName;
// 高亮结束
moveToDisk
方法接受以下参数。
storagePath
: 磁盘根目录的相对路径。options
: Drive.put 方法接受的选项。另外,您可以传递文件名属性。disk
: 定义用于保存文件的磁盘名称。如果没有定义,将使用默认磁盘。
提供上传的文件
我们建议使用 Drive 保存上传的文件,然后使用 Drive.getUrl 提供公共文件,使用 Drive.getSignedUrl 提供私人文件。
文件属性/方法
以下是可用的 File 类的属性列表.
fieldName
表单的字段名称
file.fieldName
clientName
上传的文件名称,通常是用户计算机上的文件名。
file.clientName
size
文件大小,以字节为单位。仅在文件流被使用时可用。
file.size
headers
与文件相关的 HTTP 头信息
file.headers
tmpPath
计算机/tmp
目录内的文件路径。仅在 bodyparser 中间件处理时可用,使用直接上传时无效。
file.tmpPath
filePath
文件的绝对路径。可在move
操作后使用。
file.filePath
fileName
文件的相对名称。可在move
操作后使用。
file.fileName
type
文件的 mime type。在文件流被使用后可用。
file.type
subtype
来自文件 mime type 的子类型。在文件流被使用后可用。
file.subtype
extname
文件扩展名。在文件流被使用后可用。
file.extname
state
文件处理状态,以下为可能出现的值。
idle
: 文件流处于空闲状态且未移动。streaming
: 该文件正在流式传输内容。consumed
: 文件流已被使用。moved
: 该文件已使用file.move
方法移动。
if (file.state === 'consumed') {
console.log(file.type)
}
isValid
查看该文件是否通过了验证。
if (!file.isValid) {
return file.errors
}
hasErrors
hasErrors
属性与 isValid
属性相反,即查看改文件是否未通过验证。
if (file.hasErrors) {
return file.errors
}
validated
查看文件是否经过验证,调用 file.validate()
使其生效。
if (!file.validated) {
file.validate()
}
errors
验证错误数组。
if (file.hasErrors) {
return file.errors
}
sizeLimit
参考 size
验证选项。
allowedExtensions
参考 extnames
验证选项。
validate
根据预定义的验证选项验证文件,当你使用 request.file(s)
方法访问文件时,AdonisJS 会隐式调用此方法。
move
将文件移动到文件系统上的给定位置。该方法接受目标目录和选项对象的绝对值来重命名文件。
await file.move(Application.tmpPath('uploads'), {
name: 'renamed-file-name.jpg',
overwrite: true, // 在发生冲突时覆盖文件
})
moveToDisk
使用驱动器移动文件,这些方法接收以下参数:
storagePath
: 磁盘根目录的相对路径。options
: 由 Drive.put 方法接收的选项对象。另外,必须传递文件名属性。disk
: 定义用于保存文件的磁盘名称,如果未指定,我们将使用默认磁盘。
await file.moveToDisk('./', {
name: 'renamed-file-name.jpg',
contentType: 'image/jpg'
}, 's3')
toJSON
获取 JSON 格式的文件实例。
const json = file.toJSON()
补充阅读
- 关于文件的上传分步教程
- 前端文件直传
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。