es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

NestJS: Cómo subir un archivo de manera asíncrona utilizando httpService

Estoy aprendiendo cómo subir archivos con NestJS. Específicamente, si mi formulario de envío tiene un título y un archivo de imagen. Quiero guardar la foto después de verificar algunas condiciones. He creado una API para subir y luego usar HttpService, pero parece que no funciona.

Este es el controlador de carga:

@Post('/image')
  @UseGuards(AdminAuthGuard)
  @ApiOperation({ summary: 'Subir imagen API' })
  @UseInterceptors(FileInterceptor('file', optionsImage))
  async upload(@UploadedFile('file') file): Promise<{ filename: any }> {
    return { filename: `/image/${file.filename}` };
  }

He intentado así, pero no funciona:

const formData = new FormData();
formData.append('file', file);
await this.http.post('http://localhost:3000/upload/image', formData);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que has creado una API para subir un archivo de imagen utilizando NestJS con FileInterceptor. Sin embargo, deseas guardar la foto después de verificar algunas condiciones.

    Para lograr esto, puedes modificar tu método upload para incluir la lógica de verificación de las condiciones y guardar la foto en consecuencia. Aquí tienes un ejemplo:

    @Post('/image')
    @UseGuards(AdminAuthGuard)
    @ApiOperation({ summary: 'Subir imagen API ' })
    @UseInterceptors(FileInterceptor('file', optionsImage))
    async upload(@UploadedFile('file') file): Promise<{ filename: any }> {
      // realiza tus verificaciones de condiciones aquí
      const isValidFile = checkFileValid(file);
    
      if (isValidFile) {
        // guarda el archivo de foto en disco o base de datos
        const savedFile = saveFile(file);
    
        // devuelve el nombre de archivo guardado en la respuesta
        return { filename: savedFile.filename };
      } else {
        // maneja archivos inválidos
        throw new BadRequestException('Archivo inválido');
      }
    }
    

    En este ejemplo, agregamos una condición checkFileValid() para verificar si el archivo subido cumple con ciertos criterios. Si pasa la verificación, llamamos al método saveFile() para persistir el archivo en disco y devolvemos el filename guardado en la respuesta. Si no cumple con la condición, lanzamos una BadRequestException para indicar que el archivo es inválido.

    En cuanto al uso de HttpService para subir el archivo, es posible que no funcione porque necesitas construir un objeto MultiPartFormData para formatear correctamente la carga útil de la solicitud. Puedes usar una biblioteca como form-data para crear el objeto de datos del formulario y pasarlo en el cuerpo de la solicitud:

    import * as FormData from 'form-data';
    
    // ...
    
    const formData = new FormData();
    formData.append('file', file.buffer, { filename: file.originalname });
    const response = await this.http.post(
      'http://localhost:3000/upload/image',
      formData,
      { headers: formData.getHeaders() }
    );
    

    Aquí, creamos un nuevo objeto FormData y agregamos el búfer del archivo con su nombre original. Luego, pasamos el objeto FormData en el cuerpo de la solicitud y configuramos sus encabezados utilizando el método getHeaders(). Esto debería formatear correctamente la carga útil de la solicitud y permitir la subida del archivo correctamente.

    ¡Espero que esto te ayude!

Comments are closed.