2009-08-28 7 views
0

J'ai une page ASP.NET où je génère une feuille de calcul Excel et l'envoie dans la réponse (en-tête de disposition de contenu). Cette partie fonctionne très bien, mais j'ai un bouton qui ne devient jamais réactivé parce que la page d'origine ne fait pas partie de la réponse.Comment envoyer un fichier ET la page dans une réponse HTTP?

est ici la fonction que je utilise:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse) 
    Dim theStream As New System.IO.MemoryStream() 
    theWorkBook.Save(theStream) 

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte()) 

    theStream.Position = 0 
    theStream.Read(byteArr, 0, CInt(theStream.Length)) 
    theStream.Close() 

    resp.Clear() 
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName) 
    resp.BinaryWrite(byteArr) 
    resp.End() 
End Sub 

J'essayé de ne pas effacer la réponse et l'utilisation AppendHeader au lieu de AddHeader, mais la réponse contient encore que le fichier.

Qu'est-ce qui me manque? Dois-je utiliser un en-tête différent? J'ai trouvé ce unanswered question on the ASP.NET forums; ressemble à mon problème.

Répondre

2

Vous ne pouvez pas. Vous pouvez simuler le comportement en ouvrant une fenêtre contextuelle en cliquant sur le bouton et faire en sorte que le popup serve le fichier et affiche la page depuis le javascript. Mais de cette manière, vous créez effectivement 2 demandes avec 2 réponses. Mise à jour: si vous voulez désactiver le bouton quand ils démarrent le téléchargement et l'activer dès le début du téléchargement, vous ne pouvez pas vraiment le faire mais vous pouvez utiliser un truc pour le faire apparaître comme ça. Quand ils cliquent sur le bouton de téléchargement, utilisez un javascript pour désactiver le bouton et pour créer le popup qui lance le streaming de fichiers. Lorsque la fonction filestreaming (WriteToResponse) renvoie une valeur dans la session des utilisateurs. Dans l'intervalle, demandez à la page d'origine d'interroger le serveur à l'aide d'AJAX pour voir si la valeur de session est définie. Si c'est réglé, réactivez le bouton et réglez-le sur la valeur pour le vider ou le fausser à nouveau (donc cela fonctionne une 2ème fois). Mais cela semble être un tas de trucs.

mais je pense que dans ce cas, la guérison est pire que le problème. Je suppose que vous voulez cela parce que la génération du fichier prend un certain temps et vous ne voulez pas que les utilisateurs réinitialisent le flux en appuyant sur le bouton avec impatience pendant que le fichier est en cours de préparation. Pour ce faire, je voudrais juste afficher un message dans la page sur le bouton de presse en disant quelque chose comme "Votre téléchargement est en cours de préparation.Cela pourrait prendre une minute.Merci de votre patience. (Cliquez pour fermer ce message)"

2

Vous ne pouvez pas renvoyer un fichier et une nouvelle page dans la même réponse.

Je ne suis pas sûr de savoir comment la solution adaptée à vos besoins particuliers, mais rappelez-vous que vous pouvez utiliser Javascript pour activer ou désactiver un bouton droit avant la demande de fichier de création est envoyé - le serveur (de sorte que, au moment où le téléchargement de la feuille de calcul commence pour l'utilisateur, le bouton est déjà dans l'état où vous le souhaitez).

Questions connexes