Pregunta

en el marco de juego, es posible rechazar un campo

filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));

sin volver a cargar la página?

Tengo un campo de entrada de archivo que permite a los usuarios seleccionar archivos.En el rechazo y la recarga, los archivos se borran y se muestra el error.Quiero los archivos que seleccionaron estar allí

Comportamiento actual: Antes de enviar el formulario:

antes

Después de enviar (con error: los archivos se han ido)

antes

¿Fue útil?

Solución

Los campos de entrada de selección de archivos (es decir, <input type="file" ... />) son diferentes de otros campos de entrada: no puede presencular el valor del lado del servidor. Sería un agujero de seguridad masivo si pudiera (pensar en <input type="file" value="/etc/passwd" .. />). En el servidor, cuando obtiene el formulario enviado, no obtiene la ruta completa al archivo que se cargó, solo el nombre del archivo y el contenido.

Si realmente necesita preservar el valor de su campo de entrada de archivo, deberá ir a una ruta diferente: envíe el formulario a través de AJAX (Google para la carga de archivos AJAX "para algunas técnicas y bibliotecas para ayudarlo con esto), y use la respuesta AJAX para indicar si el archivo fue válido o no.


Aclaración adicional: con el método Normal HTML / HTTP POST (que los Ayudantes de Formularios de reproducción usan), la página original se ha desaparecido, y la respuesta del servidor es una nueva página sin conexión a la página anterior. Los ayudantes de formularios de juego se presentarán antes de los campos de entrada en esta página con los valores anteriores, pero como se explica anteriormente, no es posible para un campo de entrada de archivo.

Por eso hay bibliotecas de JavaScript de propósito especial para cargar archivos. Si su forma se ocupa principalmente de hacer cargas de archivos, debe mirar esto. (por ejemplo, http://fineuploader.com ). En el lado del servidor, el objetivo de la consulta AJAX será una nueva acción que solo procesa los archivos cargados y devuelve un mensaje de éxito / falla, que luego mostrará al usuario.

Otros consejos

Si el servidor podría manipular el valor de un campo de archivo, eso sería un mayor riesgo de seguridad, ya que podríamos tomar cualquier archivo del disco duro del usuario.Si observamos los dos requisitos que tiene,

  • Obtenga contenidos de archivos en el servidor
  • No molestar el estado de la UI del cliente

    La única opción es usar un cargador de archivos AJAX.Así que su flujo ahora se convierte en:

    • Enviar el archivo a través de AJAX Subir
    • validar los contenidos
    • Guarde el archivo para la recuperación posterior
    • devolver el estado (OK o ERROR)
    • Mostrar el error en el error
    • Después de enviar todo el formulario, busque el archivo previamente guardado

      Probablemente puede engañar un poco si no le importa la carga, solo haga la validación con AJAX para mostrar el mensaje de error y deje que el archivo se esté cargando nuevamente en un envío normal.

      Se trata de trabajar con los límites que tenemos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top