C# как скачать файл с помощью libcurlnet
Может кто-нибудь показать мне правильный способ загрузки файла с указанным URL-адресом с помощью libcurlnet
FileStream fs = new FileStream("something.mp3", FileMode.Create);
WriteData wd = OnWriteData;
easy.SetOpt(CURLoption.CURLOPT_URL, downloadFileUrl);
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, wd);
if ("CURLE_OK" == easy.Perform().ToString())
{
//save_file
}
static System.Int32 OnWriteData(FileStream stream, byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
stream.Write(buf, 0, buf.Length);
return size * nmemb;
} //OnWriteData
public delegate System.Int32
WriteData(
FileStream stream, //added parameter
byte[] buf, Int32 size, Int32 nmemb, Object extraData);
1 ответ
Решение
Вам не нужно объявлять свой собственный обратный вызов для функции WriteFunction, делегат объявлен в Easy
, И вам нужно передать делегат опции WriteFunction, а не опции WriteData. Последний предназначен для объекта, который вы хотите передать делегату WriteFunction. Исправление всех этих вещей даст мне следующий рабочий код:
void Main()
{
Curl.GlobalInit(3);
var downloadFileUrl ="https://stackru.com/images/0482e4835a0ac970dd51c9389a0c16a2d0364810.png";
using(var easy = new Easy())
using(FileStream fs = new FileStream(@"something2.png", FileMode.Create))
{
// the delegate points to our method with the same signature
Easy.WriteFunction wd = OnWriteData;
easy.SetOpt(CURLoption.CURLOPT_URL, downloadFileUrl);
// we do a GET
easy.SetOpt(CURLoption.CURLOPT_HTTPGET, 1);
// set our delegate
easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wd);
// which object we want in extraData
easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, fs);
// let's go (notice that this are enums that get returned)
if (easy.Perform() == CURLcode.CURLE_OK)
{
// we can be sure the file is written correctly
"Success".Dump();
}
else
{
"Error".Dump();
}
}
}
System.Int32 OnWriteData(byte[] buf, Int32 size, Int32 nmemb, Object extraData)
{
// cast extraData to the filestream
var fs = (FileStream) extraData;
fs.Write(buf, 0, buf.Length);
return size * nmemb;
} //OnWriteData