Загрузка изображения через libcurl - PullRequest
0 голосов
/ 10 сентября 2010

Я пытаюсь загрузить изображение через 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 ]

1 голос
/ 15 октября 2010

Каждый раз, когда вызывается функция save_file, файл воссоздается вашим кодом.

Итак, вы должны проверить, существует файл или нет.

Если файл существует, FileStream должен использовать FileMode с Append.

Попробуйте коды ниже:

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();
    }
  }
}
0 голосов
/ 10 сентября 2010

Строки содержат текст, который имеет заданную кодировку (в вашем случае UTF8), вы не можете рассматривать файл .png как кодированный в utf-8 текст.

Перепишите методы HTTPGet и save_file, чтобы они работали только с байтами / байтовыми массивами.

...