Meilleur auteur de réponses
TELECHARGEMENT DES FICHIERS PDFS

Question
-
Bonjour,
J'espère que vous allez bien.
Je suis en train de developper une application qui me permettra de telecharger les fichiers pdf via le web.
ci-dessous mon code, il me permet de telecharger le fichier pdf mais il est vide. je pense qu'il y 'a une erreur de conversion des format. puisque le texte qui est stocké dans la viarble _respStr se commence par %PDF-1.4% et se termine par %EOF
_cookies = _wReq.CookieContainer Dim _postData As [String] = "" Dim _data As Byte() = _enc.GetBytes(_postData) _urlPDF = "https://MONCITE/PDF" _uriPDF = New Uri(_urlPDF) Dim result As Byte() Dim buffer As Byte() = New Byte(4095) {} _wReq = DirectCast(WebRequest.Create(_uriGETPDF), HttpWebRequest) _wReq.ContentType = "application/octet-stream" _wReq.Referer = _urlPDF _wReq.KeepAlive = True _wReq.Method = "POST" _wReq.CookieContainer = _cookies _wReq.AllowAutoRedirect = False Dim _outStream As System.IO.Stream = _wReq.GetRequestStream() _outStream.Write(_data, 0, _data.Length) _outStream.Close() _wResp = DirectCast(_wReq.GetResponse(), HttpWebResponse) _sr = New System.IO.StreamReader(_wResp.GetResponseStream()) _respStr = _sr.ReadToEnd() _sr.Close() Dim encoding As UTF8Encoding = New UTF8Encoding() Dim bytess As Byte() bytess = encoding.GetBytes(_respStr) File.WriteAllBytes("C:\REPERTOIRE\pdfDEST.pdf", bytess)
Merci pour l'aide
Réponses
-
Bonjour,
Attention le retour de votre information est du PDF donc Binaire. Aucun encoding de chaine ne doit être appliqué. Lors de la réception, vérifiez bien que vous avez ContentType = "application/pdf". Si c'est le cas, boucler tant qu'il de l'information dans GetResponseStream() et l'écrire en même temps dans le fichier. Lorsque vous utilisez la méthode Read du StreamReader, celui-ci vous retourne le nombre d'octet lu. Lorsqu'il y en a plus il retourne 0 donc quitter la boucle.
Exemple :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; namespace WebPDF { /// <summary> /// Exemple de téléchargement d'un fichier binaire (PDF en l'occurence) via HttpWebRequest... /// Par Lyamine BENKHADRA :) /// </summary> class Program { //Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf //Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url //en utilisant HttpWebRequest/HttpWebResponse // const string url = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf"; static void Main(string[] args) { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "GET"; req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"; //je suis FF désolé Microsoft... //faire votre traitement d'habitude (cookies...) //Demande de réception using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())//utilisation de la méthode synchrone. { //Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). if (resp.ContentType.ToLower() == "application/pdf") //vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition { //OK lecture puis écriture. //2 solutions : //soit on met tout en mémoire puis on enregistre. //soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM using (Stream reader = resp.GetResponseStream()) { //Writer using (FileStream pdf = File.Create(@"c:\test.pdf"))//mettre votre chemin de fichier... { //buffer de donnée 4096 est correct byte[] buffer = new byte[4096]; int len = 0; long step = 0; while ((len = reader.Read(buffer, 0, buffer.Length)) > 0)// il y a du data si len>0 { pdf.Write(buffer, 0, len); //écrit les données reçus :) //Afficher dans la console l'avancement step += len; Console.Title = string.Format ("{0}/{1}", step, resp.ContentLength);//afficher dans le titre l'avancement sur le total } //fin, fermer le fichier pdf.Close(); //normalement using ferme le fichier mais on ne sait jamais... } } } resp.Close(); //reader se fermera par ici... } } } }
Est-ce le résultat souhaité ?
(MAJ) : Oups j'ai pas fait attention que c'était du VB (fatigue de la journée). Est-ce que vous pourrez le retranscrire ?
Voici le code reprit d'un convertisseur en ligne (pas le temps de le refaire, désolé) :
Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.IO Imports System.Net Namespace WebPDF ''' <summary> ''' Exemple de téléchargement d'un fichier binaire (PDF en l'occurence) via HttpWebRequest... ''' Par Lyamine BENKHADRA :) ''' </summary> Class Program 'Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf 'Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url 'en utilisant HttpWebRequest/HttpWebResponse ' Const url As String = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf" Private Shared Sub Main(args As String()) Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest) req.Method = "GET" req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1" 'je suis FF désolé Microsoft... 'faire votre traitement d'habitude (cookies...) 'Demande de réception Using resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse) 'utilisation de la méthode synchrone. 'Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). If resp.ContentType.ToLower() = "application/pdf" Then 'vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition 'OK lecture puis écriture. '2 solutions : 'soit on met tout en mémoire puis on enregistre. 'soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM Using reader As Stream = resp.GetResponseStream() 'Writer Using pdf As FileStream = File.Create("c:\test.pdf") 'mettre votre chemin de fichier... 'buffer de donnée 4096 est correct Dim buffer As Byte() = New Byte(4095) {} Dim len As Integer = 0 Dim [step] As Long = 0 While (InlineAssignHelper(len, reader.Read(buffer, 0, buffer.Length))) > 0 ' il y a du data si len>0 pdf.Write(buffer, 0, len) 'écrit les données reçus :) 'Afficher dans la console l'avancement [step] += len 'afficher dans le titre l'avancement sur le total Console.Title = String.Format("{0}/{1}", [step], resp.ContentLength) End While 'fin, fermer le fichier 'normalement using ferme le fichier mais on ne sait jamais... pdf.Close() End Using End Using End If 'reader se fermera par ici... resp.Close() End Using End Sub Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class End Namespace
Cordialement
Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !
- Modifié Lyamine jeudi 4 octobre 2012 08:39
- Proposé comme réponse TroxsaEditor jeudi 4 octobre 2012 21:42
- Marqué comme réponse Aurel Bera lundi 8 octobre 2012 07:42
-
Bonjour Yanese,
Je viens d'effectué le test et je ne constate pas ce problème. Je pense que le problème provient de la connexion qui à du faire un timeout.
Pouvez-vous essayer avec ce code :
Imports System.IO Imports System.Net Module Module1 'Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf 'Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url 'en utilisant HttpWebRequest/HttpWebResponse ' Const url As String = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf" Sub Main() Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest) req.Method = "GET" req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1" 'je suis FF désolé Microsoft... 'faire votre traitement d'habitude (cookies...) 'Demande de réception Using resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse) 'utilisation de la méthode synchrone. 'Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). If resp.ContentType.ToLower() = "application/pdf" Then 'vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition 'OK lecture puis écriture. '2 solutions : 'soit on met tout en mémoire puis on enregistre. 'soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM Using reader As Stream = resp.GetResponseStream() 'Writer Using pdf As FileStream = File.Create("c:\tmp\test.pdf") 'mettre votre chemin de fichier... 'buffer de donnée 4096 est correct Dim buffer As Byte() = New Byte(4095) {} Dim _step As Long = 0 'lire une première fois avant de rentrer dans la boucle Dim len As Integer = reader.Read(buffer, 0, buffer.Length) While len > 0 ' il y a du data si len>0 pdf.Write(buffer, 0, len) 'écrit les données reçus :) 'Afficher dans la console l'avancement _step += len 'afficher dans le titre l'avancement sur le total Console.Title = String.Format("{0}/{1}", _step, resp.ContentLength) len = reader.Read(buffer, 0, buffer.Length) End While 'fin, fermer le fichier 'normalement using ferme le fichier mais on ne sait jamais... pdf.Close() End Using End Using End If 'reader se fermera par ici... resp.Close() End Using End Sub End Module
Cordialement
Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !
- Marqué comme réponse Yanese lundi 8 octobre 2012 17:29
Toutes les réponses
-
Bonjour,
Sauf besoin particulier voir éventuellement si WebClient ne serait pas suffisant : http://msdn.microsoft.com/en-us/library/ms144194.aspx (il y a une fonction DownloadFile toute faite).
Je ne suis pas sûr de tout suivre (je ne vois pas _uriGETPDF, c'est bien du POST ?, je doute que le codage en UTF-8 soit correct et StreamReader lit déjà en UTF8 par défaut).
Ma démarche serait de tester avec un fichier binaire tout simple (style 100 octets de 0 à 100). Egalement commencer par récupérer juste le contenu et voir ce que cela donne (là on passe par un aure stream (codage UTF8) puis on repasse encore vers des octets (codage à nouveau)). Le contenu de base n'est pas correct ?
Je pensais par exemple à http://social.msdn.microsoft.com/Forums/en-NZ/netfxbcl/thread/ddc8668d-505f-4722-9aa6-ed3ea50fcc6c (qui déjà enregistre juste les données reçues).
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
- Modifié Patrice ScribeMVP, Moderator mercredi 3 octobre 2012 17:28 Ajout lien
-
Bonjour,
Attention le retour de votre information est du PDF donc Binaire. Aucun encoding de chaine ne doit être appliqué. Lors de la réception, vérifiez bien que vous avez ContentType = "application/pdf". Si c'est le cas, boucler tant qu'il de l'information dans GetResponseStream() et l'écrire en même temps dans le fichier. Lorsque vous utilisez la méthode Read du StreamReader, celui-ci vous retourne le nombre d'octet lu. Lorsqu'il y en a plus il retourne 0 donc quitter la boucle.
Exemple :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; namespace WebPDF { /// <summary> /// Exemple de téléchargement d'un fichier binaire (PDF en l'occurence) via HttpWebRequest... /// Par Lyamine BENKHADRA :) /// </summary> class Program { //Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf //Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url //en utilisant HttpWebRequest/HttpWebResponse // const string url = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf"; static void Main(string[] args) { HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); req.Method = "GET"; req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"; //je suis FF désolé Microsoft... //faire votre traitement d'habitude (cookies...) //Demande de réception using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())//utilisation de la méthode synchrone. { //Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). if (resp.ContentType.ToLower() == "application/pdf") //vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition { //OK lecture puis écriture. //2 solutions : //soit on met tout en mémoire puis on enregistre. //soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM using (Stream reader = resp.GetResponseStream()) { //Writer using (FileStream pdf = File.Create(@"c:\test.pdf"))//mettre votre chemin de fichier... { //buffer de donnée 4096 est correct byte[] buffer = new byte[4096]; int len = 0; long step = 0; while ((len = reader.Read(buffer, 0, buffer.Length)) > 0)// il y a du data si len>0 { pdf.Write(buffer, 0, len); //écrit les données reçus :) //Afficher dans la console l'avancement step += len; Console.Title = string.Format ("{0}/{1}", step, resp.ContentLength);//afficher dans le titre l'avancement sur le total } //fin, fermer le fichier pdf.Close(); //normalement using ferme le fichier mais on ne sait jamais... } } } resp.Close(); //reader se fermera par ici... } } } }
Est-ce le résultat souhaité ?
(MAJ) : Oups j'ai pas fait attention que c'était du VB (fatigue de la journée). Est-ce que vous pourrez le retranscrire ?
Voici le code reprit d'un convertisseur en ligne (pas le temps de le refaire, désolé) :
Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.IO Imports System.Net Namespace WebPDF ''' <summary> ''' Exemple de téléchargement d'un fichier binaire (PDF en l'occurence) via HttpWebRequest... ''' Par Lyamine BENKHADRA :) ''' </summary> Class Program 'Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf 'Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url 'en utilisant HttpWebRequest/HttpWebResponse ' Const url As String = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf" Private Shared Sub Main(args As String()) Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest) req.Method = "GET" req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1" 'je suis FF désolé Microsoft... 'faire votre traitement d'habitude (cookies...) 'Demande de réception Using resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse) 'utilisation de la méthode synchrone. 'Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). If resp.ContentType.ToLower() = "application/pdf" Then 'vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition 'OK lecture puis écriture. '2 solutions : 'soit on met tout en mémoire puis on enregistre. 'soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM Using reader As Stream = resp.GetResponseStream() 'Writer Using pdf As FileStream = File.Create("c:\test.pdf") 'mettre votre chemin de fichier... 'buffer de donnée 4096 est correct Dim buffer As Byte() = New Byte(4095) {} Dim len As Integer = 0 Dim [step] As Long = 0 While (InlineAssignHelper(len, reader.Read(buffer, 0, buffer.Length))) > 0 ' il y a du data si len>0 pdf.Write(buffer, 0, len) 'écrit les données reçus :) 'Afficher dans la console l'avancement [step] += len 'afficher dans le titre l'avancement sur le total Console.Title = String.Format("{0}/{1}", [step], resp.ContentLength) End While 'fin, fermer le fichier 'normalement using ferme le fichier mais on ne sait jamais... pdf.Close() End Using End Using End If 'reader se fermera par ici... resp.Close() End Using End Sub Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class End Namespace
Cordialement
Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !
- Modifié Lyamine jeudi 4 octobre 2012 08:39
- Proposé comme réponse TroxsaEditor jeudi 4 octobre 2012 21:42
- Marqué comme réponse Aurel Bera lundi 8 octobre 2012 07:42
-
Bonjour,
Juste pour signaler qu'il existe des sites de conversion de code C# en vb.net si vous ne comprenez pas très bien le C#
Personnellement je passe par ce site --> http://www.developerfusion.com/tools/convert/vb-to-csharp/
Cordialement,
-
Bonjour,
Juste pour signaler qu'il existe des sites de conversion de code C# en vb.net si vous ne comprenez pas très bien le C#
Personnellement je passe par ce site --> http://www.developerfusion.com/tools/convert/vb-to-csharp/
Cordialement,
Me too ;)Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !
-
Bonjour,
Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?
Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !
Cordialement,
Aurel
-
Bonjour, merci à vos réponses.
Lyamine, j'ai changé mon code comme vous avez dit, mais une erreur s'affiche lors de l'exécution. la voila:
The request was aborted: The connection was closed unexpectedly.
ça produit à cause de cette ligne
While (InlineAssignHelper(len, reader.Read(buffer, 0, buffer.Length))) > 0
je cherche maintenant comment résoudre ce problème. si vous avez encore des idées?
-
Bonjour Yanese,
Je viens d'effectué le test et je ne constate pas ce problème. Je pense que le problème provient de la connexion qui à du faire un timeout.
Pouvez-vous essayer avec ce code :
Imports System.IO Imports System.Net Module Module1 'Exemple d'url : http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf 'Ceci n'est qu'un simple exemple pour montrer comment vérifier et enregistrer le fichier de l'url 'en utilisant HttpWebRequest/HttpWebResponse ' Const url As String = "http://fbeaulieu.ftp-developpez.com/guide/beaulieu-delphi-pascal.pdf" Sub Main() Dim req As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest) req.Method = "GET" req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1" 'je suis FF désolé Microsoft... 'faire votre traitement d'habitude (cookies...) 'Demande de réception Using resp As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse) 'utilisation de la méthode synchrone. 'Console.WriteLine(resp.ContentType); //bien vérifier le Content-Type = à pdf (afficher la valeur). If resp.ContentType.ToLower() = "application/pdf" Then 'vérifier s'il n'existe pas avec x-pdf, si c'est le cas ajouter à la condition 'OK lecture puis écriture. '2 solutions : 'soit on met tout en mémoire puis on enregistre. 'soit on enregistre au file de la lecture. <--- méthode utilisé pour ne pas gonfler la RAM Using reader As Stream = resp.GetResponseStream() 'Writer Using pdf As FileStream = File.Create("c:\tmp\test.pdf") 'mettre votre chemin de fichier... 'buffer de donnée 4096 est correct Dim buffer As Byte() = New Byte(4095) {} Dim _step As Long = 0 'lire une première fois avant de rentrer dans la boucle Dim len As Integer = reader.Read(buffer, 0, buffer.Length) While len > 0 ' il y a du data si len>0 pdf.Write(buffer, 0, len) 'écrit les données reçus :) 'Afficher dans la console l'avancement _step += len 'afficher dans le titre l'avancement sur le total Console.Title = String.Format("{0}/{1}", _step, resp.ContentLength) len = reader.Read(buffer, 0, buffer.Length) End While 'fin, fermer le fichier 'normalement using ferme le fichier mais on ne sait jamais... pdf.Close() End Using End Using End If 'reader se fermera par ici... resp.Close() End Using End Sub End Module
Cordialement
Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !
- Marqué comme réponse Yanese lundi 8 octobre 2012 17:29
-