2011-06-08 5 views
1

Je reçois des envois de fichiers asynchrones à partir des messages du formulaire utilisateur remplis [en utilisant un outil qui utilise les iframes]] Ce que je fais est sur la page de formulaire en configurant un champ avec un GUID caché que je passe à l'iframe dans la chaîne de requête. Ensuite, la page iframe gère le téléchargement en utilisant une méthode de base par laquelle il prend les 2 premiers caractères du guid pour un répertoire et les 2 suivants pour un sous-répertoire, essentiellement pour éviter d'avoir des milliers de fichiers dans 1 dir.asp.net suppression du fichier d'objet cache

Mon problème est le suivant. Si un utilisateur télécharge une image et ne soumet jamais le formulaire, le fichier doit être supprimé. Je pense à utiliser l'objet cache car il s'agit d'un environnement de serveur unique. Ainsi, sur un post de fichier, la page fileupload vérifie l'objet cache pour un postid s'il en trouve un il supprime le fichier existant [ils ont téléchargé un fichier puis changé en un nouveau], il écrit le nouveau fichier sur le disque. Mon problème est que s'ils téléchargent le dossier et ne soumettent jamais simplement le formulaire j'ai besoin de supprimer le dossier. Je suppose que je peux utiliser un délégué dans l'objet de cache pour résoudre ce problème? Quelque chose comme si le formulaire soumet invalide l'objet cache afin qu'il n'expire jamais, et l'enregistre dans la base de données comme un bon fichier, et si pas après 20 minutes, l'objet cache supprime n'importe quel nom de fichier dans sa clé. Voici le code que j'ai jusqu'ici

protected void Page_Load(object sender, EventArgs e) 
    { 
     string PostID = Request.QueryString["a"]; 
     HttpFileCollection hfc = Request.Files; 
      for (int i = 0; i < hfc.Count; i++) 
      { 
       HttpPostedFile hpf = hfc[i]; 
       if (hpf.ContentLength > 0) 
       { 

        if (Cache[PostID] != null) 
        { 
     File.Delete(Server.MapPath("~/Uploads/") + 
     Cache[PostID].ToString().Substring(0,2) + 
     Cache[PostID].ToString().Substring(2,2) + "/" + Cache[PostID].ToString()); 
        } 
        System.IO.FileInfo fe = new System.IO.FileInfo(PostID); 
        string extension = fe.Extension; 
        string Directory1 = PostID.Substring(0, 2); 
        string Directory2 = PostID.Substring(2, 2); 
        if (!Directory.Exists(Server.MapPath("~/Uploads/") + 
         Directory1)) 
        { 
         Directory.CreateDirectory(Server.MapPath("~/Uploads/") + 
         Directory1); 
        } 
        if (!Directory.Exists(Server.MapPath("~/Uploads/") + 
        Directory1 + "/" + Directory2)) { 
         Directory.CreateDirectory(Server.MapPath("~/Uploads/") + 
         Directory1 + "/" + Directory2); 
        } 
        hpf.SaveAs(Server.MapPath("~/Uploads/") + 
        Directory1 + "/" + Directory2 + "/" + 
        PostID + "." + extension); 

        Cache.Insert("PostID", 
        PostID + extension, 
        null, 
        System.Web.Caching.Cache.NoAbsoluteExpiration, 
        TimeSpan.FromMinutes(20)); 
       } 
      }   
+0

Je me rends compte maintenant que l'objet cache asp.net n'est pas partagée entre les processus de sorte l'objet cache un processus utilise peuvent ne pas être disponibles quand ils essaient de télécharger un autre fichier donc j'abandonne cette méthode à moins que quelqu'un ait une bonne idée et que j'utilise simplement des appels à la base de données. Plus lent mais plus fiable. – Jordan

Répondre

2

Juste une idée, mais ne pouvez-vous pas télécharger les fichiers dans un dossier intermédiaire d'abord? Déplacez les fichiers à l'emplacement final lorsque le formulaire est soumis. Supposons que tous les fichiers encore dans le dossier de transfert après un certain laps de temps aient été abandonnés & puis supprimez-les à l'aide d'un script qui s'exécute périodiquement.

0

Avez-vous envisagé d'utiliser Session_End() dans Global.asax pour nettoyer les fichiers? Je n'ai jamais utilisé cet événement. Je peux me tromper, mais d'après ce que j'ai compris, cela se déclenche après la fin de la session, soit par expiration du délai, soit par déconnexion.

La création d'une structure de dossiers basée sur les 4 premiers caractères d'un guid ne sera pas unique. Une collision va se produire. Utilisez le GUID entier comme nom de dossier. Vous pouvez stocker le GUID dans la base de données et récupérer plus tard les GUID et analyser le répertoire de téléchargement en supprimant les répertoires trouvés.

répertoires Windows temp est sont disponibles en .Net Path.GetTempFileName()

Questions connexes