文件上传

未匹配的标注

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'],
})!

// highlight-start
await coverImage.moveToDisk('./')

// Get the name of the saved file; to store it in your database, for example.
const fileName = coverImage.fileName;
// highlight-end

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()

补充阅读

  • 关于文件的上传分步教程
  • 前端文件直传

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/adonisjs/5.x/ht...

译文地址:https://learnku.com/docs/adonisjs/5.x/ht...

上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~