2010-09-10 5 views
0

je tente de télécharger l'image via libcurl (je sais que d'autres options pour télécharger, mais je dois pour le faire via libcurl)Téléchargement de l'image via libcurl

Quand je télécharger & enregistrer l'image, je ne peux pas l'ouvrir. La taille du fichier est différente de celle que je télécharge moi-même.

using System; 
using System.Windows.Forms; 
using SeasideResearch.LibCurlNet; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      HTTP cURL = new HTTP(); 
      cURL.CurlInit(); 

      // Getting Data - Downloading the picture 
      String data = cURL.HTTPGet("http://www.hcs.harvard.edu/csharp/Logo1.png"); 

      // Saving Picture 
      HTTP.save_file("bilde2.jpg", data); 
     } 
    } 

    class HTTP 
    { 
     public Easy easy; 
     public string SockBuff; 

     public void CurlInit() 
     { 
      Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 
     } 

     public string HTTPGet(string URL) 
     { 
      easy = new Easy(); 

      Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 
      easy.SetOpt(CURLoption.CURLOPT_URL, URL); 
      easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); 
      //easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, f); 
      easy.Perform(); 
      return SockBuff; 
     } 


     public Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 
     { 
      SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf); 
      return size * nmemb; 
     } 

     static public void save_file(string file_name, string text_to_write) 
     { 
      using (FileStream stream = new FileStream(file_name, FileMode.Create)) 
      { 
       using (BinaryWriter writer = new BinaryWriter(stream)) 
       { 
        //writer.Write("hello"); 
        writer.Write(text_to_write); 
        writer.Close(); 
       } 
      } 
     } 

    } 
} 

Qu'est-ce que je fais mal ici?

+2

Êtes-vous sûr que vous devez utiliser des chaînes pour passer autour blobs binaires? –

+0

Je suis programmeur débutant donc je ne suis pas sûr de savoir comment écrire dans le fichier sans utiliser de chaînes – user444434

Répondre

0

Les chaînes contiennent du texte, qui ont un encodage donné (UTF8 dans votre cas), vous ne pouvez pas traiter un fichier .png comme utf-8 texte codé.

Réécrire vos méthodes HttpGet et save_file pour traiter uniquement avec des tableaux d'octets/octet.

+0

Comment puis-je le faire? – user444434

+0

J'ai essayé de le coder pour ne pas utiliser UTF8, mais cela n'a pas fonctionné. Besoin de chemin. – user444434

+0

Comment puis-je sauvegarder Byte [] buf? – user444434

1

Chaque fois est appelée la fonction save_file, le fichier est recréé par votre code.

Donc, vous devriez vérifier le fichier est existe ou non.

Si le fichier est existe, FileStream doit utiliser le FileMode avec Append.

Essayez les codes ci-dessous:

static public void save_file(string file_name, string text_to_write) 
{ 
    using (var stream = File.Exists(file_name) 
    ? new FileStream(file_name, FileMode.Append) 
    : new FileStream(file_name, FileMode.Create)) 
    { 
    using (var writer = new BinaryWriter(stream)) 
    { 
     //writer.Write("hello"); 
     writer.Write(text_to_write); 
     writer.Close(); 
    } 
    } 
}