Adaptador FormData
Use o decorator de parâmetro @FormData() para extrair payloads multipart em um objeto tipado. Ele funciona em parâmetros de handlers dentro de controllers.
Importação
ts
import { FormData, type FormDataPayload } from "@bunstone";Uso
ts
class UploadController {
@Post("/upload")
upload(
@FormData({
fileField: "files", // opcional: campo específico de onde ler arquivos
allowedTypes: ["image/avif"], // opcional: mimes ou extensões permitidas
jsonField: "meta", // opcional: faz o parse deste campo como JSON
})
payload: FormDataPayload
) {
// payload.files: File[]
// payload.json: JSON parseado de jsonField, se fornecido
}
}Opções
fileField(string): Lê arquivos apenas deste campo. O padrão é ler todos os valores de arquivo do formulário.allowedTypes(string[]): Tipos MIME ou extensões permitidos. Rejeita os demais com bad request.jsonField(string): Nome do campo a ser parseado como JSON. Rejeita valor não string ou JSON inválido.
Formato do payload
ts
type FormDataPayload = {
files: File[];
json?: unknown;
};Exemplo prático
Explore o tratamento de form-data com múltiplos campos:
ts
import {
Module,
Controller,
Post,
Get,
AppStartup,
CacheAdapter,
FormData,
} from "../../index";
@Controller("cache")
class CacheController {
constructor(private readonly cache: CacheAdapter) {}
@Get(":key")
async getCache(key: string) {
const value = await this.cache.get(key);
return { key, value };
}
@Post(":key")
async setCache(key: string, @Body() body: any) {
await this.cache.set(key, body, { ttlSeconds: 60 });
return { success: true };
}
}
@Controller("upload")
class UploadController {
@Post()
async uploadFile(@FormData() formData: any) {
// Access form fields and files
const { fields, files } = formData;
return {
receivedFields: Object.keys(fields),
receivedFiles: Object.keys(files),
};
}
}
@Module({
controllers: [CacheController, UploadController],
providers: [CacheAdapter],
})
class AppModule {}
const app = await AppStartup.create(AppModule);
console.log("Adapters example configured.");