2017-10-17 2 views
1

Je suis en train d'écrire un code jQuery pour télécharger le fichier et après le téléchargement le fichier doit supprimer du serveur. Ci-dessous est mon code pour le téléchargement de fichiers et supprimer le fichier.javascript - Appel complet d'abord avant la partie de succès dans jquery ajax

if (method == "ValueAddedReportExportToExcel") {     
    $.ajax({ 
     async: false, 
     type: "post", 
     cache: false, 
     url: '@Url.Action("ValueAddedReportExportToExcel", "report")', 
     data: { 
      fromDate: $('#txtFromDate').val(), 
      toDate: $('#txtToDate').val(), 
      reportForWhom: $("#ddlReportForWhom").val(), 
      customers: (ddlCustomers != null) ? ddlCustomers.join(',') : "", 
      salesReps: (salesReps != null) ? salesReps.join(',') : "", 
      users: (users != null) ? users.join(',') : "", 
      emailTo: emailTo, 
      subject: subject, 
      body: body, 
     }, 
     success: function (data) { 
      fileName = data.fileName; 

      // call to download action.   
      window.location = '@Url.Action("Download", "Report")' + '?file=' + data.fileName; 
      console.log('Success Call'); 
     }, 
     complete: function() { 
      console.log('Complete Call'); 
      $.ajax({ 
       async: false, 
       type: "post", 
       url: '@Url.Action("DeleteFile", "Report")', 
       data: { file: filename }, 
       success: function() { 
        alert(filename + ' is deleted successfuly. '); 
       } 
      }); 
     } 
    }); 
    //methodURL = '@Url.Action("ValueAddedReportExportToExcel", "report")'; 
} 

Et au-dessous de deux fonctions sont pour télécharger et supprimer la fonction dans le contrôleur.

public virtual ActionResult Download(string file) 
{ 
    string fullPath = Path.Combine(Server.MapPath("~/CostSavingReport"), file); 
    byte[] fileBytes = System.IO.File.ReadAllBytes(fullPath); 
    //return File(fileBytes, "application/vnd.ms-excel", file); 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, file); 
} 

public virtual void DeleteFile(string file) 
{ 
    try 
    { 
     var fullPath = Path.Combine(Server.MapPath("~/CostSavingReport"), file); 
     if (System.IO.File.Exists(fullPath)) 
     { 
      System.IO.File.Delete(fullPath); 
     } 
    } 
    catch (Exception) 
    { 
    } 
} 

Maintenant, le problème est d'abord l'action DeleteFile est appelée au lieu d'action Download ce qu'il faut faire pour faire appel à d'abord Download et après DeleteFile.

+0

Supprimer ce côté serveur. –

+0

Et après cela, que dois-je faire? @SergeK. –

+0

Déplacez la partie de suppression dans la fonction 'Download' si vous voulez supprimer le fichier une fois qu'il a été téléchargé. Sinon, vous comptez sur le client qui peut quitter la page une fois le téléchargement terminé et le code de suppression ne sera jamais appelé quelle que soit votre solution. –

Répondre

3

vous pouvez créer attribut personnalisé pour cette action comme ci-dessous qui exécute après votre méthode est été exécutée

public class DeleteFileAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     // Delete file 
    } 
} 

et de l'utiliser sur votre action

[DeleteFileAttribute] 
public virtual ActionResult Download(string file) 
{ 
    string fullPath = Path.Combine(Server.MapPath("~/CostSavingReport"), file); 
    byte[] fileBytes = System.IO.File.ReadAllBytes(fullPath); 
    //return File(fileBytes, "application/vnd.ms-excel", file); 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, file); 
} 
+0

Désolé, mais pas si familier avec ActionFilters, pouvez-vous jeter de la lumière où écrire le code de suppression de fichier? dans DeleteFile ou OnActionExecuted? –

+0

vous devez écrire votre code de suppression dans la méthode "public override void OnActionExecuted (ActionExecutedContext filterContext)" et cette méthode va appeler juste après la fin du téléchargement. –

+0

@ wacky_coder vous pouvez vous référer https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx pour plus de référence –