通过libcurl下载图像

时间:2010-09-10 16:55:20

标签: c# libcurl

我尝试通过libcurl下载图像(我知道其他选项可以下载,但我需要通过libcurl完成)

当我下载&保存图像,我无法打开它。 文件大小与我自己下载文件时的大小不同。

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();
                }
            }
        }

    }
}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

每次调用函数save_file时,都会通过代码重新创建文件。

因此,您应该检查文件是否存在。

如果文件存在,FileStream应该使用附加的FileMode。

请尝试以下代码:

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();
    }
  }
}

答案 1 :(得分:0)

字符串包含具有给定编码的文本(在您的情况下为UTF8),您不能将.png文件视为utf-8编码文本。

重写HTTPGet和save_file方法,只处理字节/字节数组。