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));
}
}
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