2011-08-22 23 views
5

Tengo un formulario web que permite a los usuarios subir archivos mientras se abre un ticket en nuestro sistema. La carga se realiza utilizando el control "ajax control toolkit" asyncFileUpload.ASP.NET - Almacenar archivos temporales

La idea es tener archivos guardados en un directorio temporal y solo guardarlos en la ubicación permanente cuando el usuario presione el botón "confirmar".

Me gustaría poder deshacerme de los archivos temporales que ya no son relevantes (por ejemplo, el usuario deja la página abierta durante un mes sin publicar el formulario).

¿Cuál sería la mejor manera de no conservar los archivos temporales para siempre? ¿Tal vez guardarlos en la sesión? ¿Tal vez mantenerlos en viewstate?

Podría agregar algunos JS a la página con un tiempo de espera y agregar algún código que se ejecute cuando el usuario abandone la página. Pero estas ideas son soluciones del lado del cliente. No me gustaría que alguien altere el código y me deje basura en mi sistema.

¿Alguna otra idea?

Gracias, Summerbulb

+0

¿Qué quiere decir temporal aquí? ¿Es la ubicación temporal en el servidor o no quieres descargar el archivo por completo? – Ankit

+0

@Ankit: los archivos solo son necesarios si el usuario decide publicar el formulario. De lo contrario, deberían ser eliminados. – summerbulb

Respuesta

3

Mi sugerencia es agregar un controlador On_SessionEnd en Global.asax y eliminar los archivos temporales cuando finalice la sesión del usuario. Puede nombrar los archivos temporales que le añaden el ID de sesión (o anteponer el ID de sesión, lo que desee) y de esa manera solo eliminará los archivos para el usuario cuya sesión haya finalizado. También puede agregar un controlador On_Application_End a Global.asax para eliminar TODOS los archivos en el directorio temporal.

7

Tal vez ellos mantener los archivos en la sesión?

No. Esto innecesariamente utilizaría grandes cantidades de memoria del servidor y los usuarios podrían afectar negativamente el rendimiento general de su servidor al cargar archivos de gran tamaño.

¿Tal vez lo guardar en el ViewState?

No. Esto significaría en la práctica que todos los envíos de devolución implicaría subir ( y descarga) el archivo de nuevo sin ninguna razón. El rendimiento de la aplicación se reduciría significativamente y proporcionaría una experiencia de usuario deficiente (sin mencionar el consumo de ancho de banda, que puede costarle dinero).


Los archivos se almacenan en una ubicación temporal en el servidor, ¿verdad? Y la aplicación rastrea información sobre los archivos en un almacén de datos de algún tipo (supongo que una base de datos SQL)? Recomiendo tener una aplicación por separado para manejar la limpieza, especialmente porque estás hablando en la escala de un mes.

Un servicio de Windows o una aplicación de consola programada harían bien el trabajo. Puede, a intervalos regulares, verificar el directorio y la base de datos y, según las reglas que le dé, realizar algunas tareas de limpieza. Tal vez incluso use cualquier mecanismo de mensajería que pueda existir en el sistema de tickets para notificar al usuario de esta acción, notificar a un administrador, etc.

+1

Si tiene un servidor SQL detrás de todo esto, considere un paquete de SSIS que se ejecuta todas las noches. puedes hacer casi cualquier cosa con él y es trivial programarlo. Beats tiene otra aplicación completa para rastrear. – Bill

+0

+1. el servicio es el camino correcto a seguir. Una alternativa sería verificar en el evento sessionStart los archivos que son demasiado antiguos, pero el tiempo que el servidor necesita para eliminar los archivos es el momento, los usuarios tienen que esperar en su primera visita. Recomiendo usar un servicio para este – citronas

+0

@citronas: De hecho, definitivamente me mantendría alejado de cualquier evento del sitio por algo como esto. Es una operación basada en el tiempo en lugar de una operación de solicitud/respuesta (que es para lo que es una aplicación web). También me gusta la sugerencia de Bill para SSIS, estoy mucho menos familiarizado con su mantenimiento. (Argumentaría que "tener otra aplicación completa para rastrear" también es trivial, pero eso no está ni aquí ni allá. El punto general de tener un trabajo programado en el servidor permanece.) – David

1

Puede almacenar los archivos en la carpeta temporal del usuario. Si esto es un buen enfoque en su escenario particular que no puedo decir con certeza:

var dir = System.IO.Path.GetTempPath(); 

La ruta dependerá del usuario actual (Windows), sin embargo.

http://msdn.microsoft.com/en-us/library/system.io.path.gettemppath.aspx

+0

¿cómo es eso posible? quieres decir guardar en la carpeta TEMP del servidor? y luego nuevamente, el servidor debe reiniciarse antes de que se limpie la carpeta temporal o algo así. – highwingers

0

Por comprometerse puede emitir un comando System.IO.File.Move().Los archivos restantes se pueden eliminar con un servicio o una aplicación de consola si tiene acceso al servidor para hacer esto.

Cuestiones relacionadas