我尝试通过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();
}
}
}
}
}
我在这里做错了什么?
答案 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方法,只处理字节/字节数组。