Uploads de arquivo
O AdonisJS fornece uma API robusta e de alto desempenho para lidar com uploads de arquivo. Você não só pode processar e armazenar arquivos enviados localmente, mas também pode transmiti-los diretamente para serviços de nuvem como S3, Cloudinary ou armazenamento em nuvem do Google.
DICA
Confira Attachment Lite. Um pacote opinativo para converter qualquer coluna em seu modelo Lucid em um tipo de dados de anexo. Tornando o upload de arquivo limpo e fácil.
Acessando arquivos enviados
O middleware bodyparser registrado dentro do arquivo start/kernel.ts
processa automaticamente todos os arquivos para solicitações multipart/form-data
.
Você pode acessar os arquivos usando o método request.file
. O método aceita o nome do campo e retorna uma instância da classe File, ou null
se nenhum arquivo foi carregado.
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'))
}
})
Ao aceitar vários arquivos da mesma entrada, você pode usar o método request.files
(a forma plural) para retornar uma matriz das instâncias do arquivo.
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'))
}
})
Validando arquivos
Você também pode validar o arquivo especificando as regras para a extensão do arquivo e o tamanho do arquivo, e o AdonisJS executará as validações implicitamente.
NOTA
Tentamos detectar a extensão do arquivo usando o arquivo número mágico e retornar à extensão do nome do arquivo quando não for possível detectá-lo usando o número mágico.
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'))
Validando arquivos usando o validador
Você também pode usar o validator para validar os arquivos enviados pelo usuário junto com o restante do formulário.
O método schema.file
valida a entrada para ser um arquivo válido, junto com quaisquer regras de validação personalizadas fornecidas para o tamanho do arquivo e a extensão.
Se a validação do arquivo falhar, você pode acessar a mensagem de erro junto com os erros do formulário. Caso contrário, você pode acessar a instância do arquivo e movê-la para o local desejado.
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'))
})
Salvando arquivos
Você pode salvar arquivos enviados pelo usuário usando o método moveToDisk
. Ele usa AdonisJS Drive por baixo dos panos para salvar arquivos.
const coverImage = request.file('cover_image', {
size: '2mb',
extnames: ['jpg', 'png', 'gif'],
})!
await coverImage.moveToDisk('./')
// Obtenha o nome do arquivo salvo; para armazená-lo em seu banco de dados, por exemplo.
const fileName = coverImage.fileName;
O método moveToDisk
aceita os seguintes argumentos.
storagePath
: Um caminho relativo para a raiz do disco. Método Drive.put. Além disso, você pode passar a propriedade do nome do arquivo.disk
: Defina o nome do disco a ser usado para salvar o arquivo. Se não for definido, usaremos o disco padrão.
Servindo arquivos enviados
Recomendamos usar o Drive para salvar arquivos enviados pelo usuário e, em seguida, usar Drive.getUrl para servir arquivos públicos e Drive.getSignedUrl para servir arquivos privados.
Propriedades/métodos do arquivo
A seguir está a lista de propriedades na classe File.
fieldName
Referência ao nome do arquivo de entrada.
file.fieldName
clientName
O nome do arquivo carregado. Geralmente é o nome do arquivo no computador do usuário.
file.clientName
size
O tamanho do arquivo está em bytes. O tamanho do arquivo só está disponível quando o fluxo de arquivo foi consumido.
file.size
headers
Os cabeçalhos HTTP associados ao arquivo
file.headers
tmpPath
O caminho do arquivo dentro do diretório /tmp
do computador. Ele está disponível apenas quando os arquivos são processados pelo middleware bodyparser e não durante uploads diretos.
file.tmpPath
filePath
O caminho absoluto do arquivo. Disponível após a operação move
.
file.filePath
fileName
O nome relativo do arquivo. Disponível após a operação move
.
file.fileName
type
O arquivo tipo MIME. Disponível após o fluxo de arquivo ter sido consumido
file.type
subtype
O subtipo do tipo MIME do arquivo. Disponível após o fluxo de arquivo ter sido consumido.
file.subtype
extname
A extensão do arquivo. Disponível após o fluxo de arquivo ter sido consumido.
file.extname
state
O estado de processamento do arquivo. É um dos seguintes.
idle
: O fluxo de arquivo está ocioso e não está fluindo.streaming
: O arquivo está transmitindo o conteúdo.consumed
: O fluxo de arquivo foi consumido.moved
: O arquivo foi movido usando o métodofile.move
.
if (file.state === 'consumed') {
console.log(file.type)
}
isValid
Descubra se o arquivo passou na validação ou não.
if (!file.isValid) {
return file.errors
}
hasErrors
A propriedade hasErrors
é o oposto da propriedade isValid
.
if (file.hasErrors) {
return file.errors
}
validated
Descubra se o arquivo foi validado ou não. Chame file.validate()
para validá-lo.
if (!file.validated) {
file.validate()
}
errors
Uma matriz de erros de validação
if (file.hasErrors) {
return file.errors
}
sizeLimit
Referência à opção de validação size
.
allowedExtensions
Referência à opção de validação extnames
.
validate
Valide o arquivo em relação às opções de validação predefinidas. O AdonisJS chama implicitamente esse método quando você acessa o arquivo usando o método request.file(s)
.
move
Mova o arquivo para um determinado local no sistema de arquivos. O método aceita um absoluto para o diretório de destino e o objeto options para renomear o arquivo.
await file.move(Application.tmpPath('uploads'), {
name: 'renamed-file-name.jpg',
overwrite: true, // sobrescrever em caso de conflito
})
moveToDisk
Mover arquivo usando Drive. Os métodos aceitam os seguintes argumentos:
storagePath
: Um caminho relativo para a raiz do disco. Método Drive.put. Além disso, você tem que passar a propriedade do nome do arquivodisk
: Defina o nome do disco a ser usado para salvar o arquivo. Se não for definido, usaremos o disco padrão.
await file.moveToDisk('./', {
name: 'renamed-file-name.jpg',
contentType: 'image/jpg'
}, 's3')
toJSON
Obtenha a representação do objeto JSON da instância do arquivo.
const json = file.toJSON()
Leitura adicional
- Tutorial passo a passo sobre uploads de arquivos
- Uploads diretos de arquivos