2009-03-31 14 views
1

J'ai une application Flex qui appelle une page .aspx sur notre serveur web, qui construit un fichier PDF ou Excel. À l'heure actuelle, j'utilise navigateToURL() pour appeler le fichier, et cela fonctionne correctement lorsque le fichier de sortie est construit avec succès. Cependant, s'il y a une erreur ou un délai, il n'y a aucun moyen de le savoir dans le film Flash. J'essaie d'utiliser URLLoader à la place, afin que je puisse écouter un code d'état HTTP, et savoir quand le chargement est terminé, cependant, l'URLLoader retourne simplement les données bitmap, sans que rien ne pousse l'utilisateur à ouvrir ou enregistrer le fichier de sortie. Est-ce qu'il y a un moyen de faire ça?Comment inviter un utilisateur à ouvrir ou enregistrer un fichier PDF renvoyé par un fichier .aspx?

Voici les deux versions de mon code ActionScript:

private function buildFile():void 
{ 
    var variables:URLVariables = new URLVariables(); 

    variables.rptName = "report1"; 

    variables.rptFormat = "PDF"; 

    var request:URLRequest = new URLRequest(); 

    request.url = "/buildFile.aspx"; 

    request.method = URLRequestMethod.POST; 

    request.data = variables; 

    var loader:URLLoader = new URLLoader(); 

    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, 
             httpStatusHandler); 

    loader.load(request); 
} 


private function buildFile():void 
{ 
    var variables:URLVariables = new URLVariables(); 

    variables.rptName = "report1"; 

    variables.rptFormat = "PDF"; 

    var request:URLRequest = new URLRequest(); 

    request.url = "/buildFile.aspx"; 

    request.method = URLRequestMethod.POST; 

    request.data = variables; 

    navigateToURL(request, "_self"); 
} 

Pour votre information, voici le bloc de code qui génère actuellement le fichier PDF ou Excel:

System.Web.HttpContext httpC; 
httpC = System.Web.HttpContext.Current; 
httpC.Response.Clear(); 
httpC.Response.ClearHeaders(); 
httpC.Response.Expires = 0; 
switch (ReportFormat) 
{ 
    case "Excel": Response.ContentType = "application/vnd.ms-excel"; break; 

    case "PDF": Response.ContentType = "application/pdf"; ; break; 

} 

Response.AddHeader("Content-disposition", "attachment;filename=" + fileName);  

BinaryWriter binaryWriter = new BinaryWriter(httpC.Response.OutputStream); 

binaryWriter.Write(result); 

Répondre

6

serveur Vous devez envoyer « l'application/octet-stream "en-tête lorsque l'utilisateur demande ce fichier PSD.

Avec ASP.NET, il pourrait ressembler à ceci:

Response.ClearContent(); 
Response.ClearHeaders(); 
// with this header user will be promted to open or download file 
Response.ContentType = "application/octet-stream"; 
// with this header, you will suggest to save file with "test.pdf" name 
Response.AddHeader("Content-Disposition", "attachment; filename=test.pdf"); 
Response.WriteFile(Server.MapPath("~/test.pdf")); 
Response.Flush(); 
Response.Close(); 

Jetez aussi un oeil ici: Downloading files in Flex using the FileReference class

+0

Je vais devoir vérifier avec le développeur .NET pour voir comment il définit les en-têtes de réponse. J'espérais que quelqu'un pourrait m'aider sur le Flex. –

+0

@Eric, pourquoi ne pas simplement rediriger l'utilisateur vers l'URL appropriée avec un fichier PDF? –

+0

Nous voulons afficher la boîte de dialogue qui donne à l'utilisateur l'option "Enregistrer" ou "Ouvrir". Le code existant fonctionne correctement lorsque j'utilise navigateToURL() avec "_self" comme cible. Mais, il n'y a aucun moyen de suivre la progression et/ou l'achèvement. C'est pourquoi j'essaie d'utiliser URLLoader.load(). –

0

a également établi la disposition de contenu dans la page ASPX "attachement".