PDA

Просмотр полной версии : как скачать картинку в файл с помощью libcurl?


eldar85
23.04.2010, 22:00
не могу понять в как в курле скачивать картинку с сайта какого либо в файл, чтобы можно было к примеру на диск С скачать картинку...
можете помочь?) очень нужно...

M_script_
23.04.2010, 22:04
так
//---------------------------------------------------------------------------
struct CapFile
{
const char *filename;
FILE *stream;
};
//---------------------------------------------------------------------------
static size_t CapWrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct CapFile *out=(struct CapFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);
}
//---------------------------------------------------------------------------


и так

struct CapFile cap_file = {sFileName.c_str(), NULL};

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CapWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cap_file);
curl_easy_setopt(curl, CURLOPT_URL, sUrl.c_str());
curl_easy_perform(curl);

eldar85
23.04.2010, 22:08
ого как быстро ответили)) большое вам спасибо)))

eldar85
25.04.2010, 20:35
блин, чет я кажется не то наделал, подскажите пожалуйста где накосячил то??
#include <curl/curl.h>
#include <QApplication>
#include <stdio.h>
#include <c++/iostream>
#include <c++/string>

struct CapFile
{
const char *filename;
FILE *stream;
};

//---------------------------------------------------------------------------
static size_t CapWrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct CapFile *out=(struct CapFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);
}


int main(int argc, char* argv[])
{
CURL* curl;
curl = curl_easy_init();
string sUrl = "http://www.missfit.ru/i/4215472799.jpg";
string sFileName = "c:/zove/";

struct CapFile cap_file = {sFileName.c_str(), NULL};

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CapWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cap_file);
curl_easy_setopt(curl, CURLOPT_URL, sUrl.c_str());
curl_easy_perform(curl);
int i;
std::cin >> i;

return 0;
}

M_script_
25.04.2010, 21:22
блин, чет я кажется не то наделал, подскажите пожалуйста где накосячил то??
sFileName - имя файла

eldar85
25.04.2010, 21:43
тоесть как будет называться сама картинка после скачиваания?))

eldar85
25.04.2010, 21:48
а что значит "wb" ???)

Ra$cal
25.04.2010, 23:00
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

eldar85
25.04.2010, 23:18
спасибо...)
вот сделал так, по идее должен же скачать файл и поместить возле экзэшника, но ничего нету...

#include <curl/curl.h>
#include <QApplication>
#include <stdio.h>
#include <c++/iostream>
#include <c++/string>

struct CapFile
{
const char *filename;
FILE *stream;
};

//---------------------------------------------------------------------------
static size_t CapWrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct CapFile *out=(struct CapFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);
}


int main(int argc, char* argv[])
{
CURL* curl;
curl = curl_easy_init();
string sUrl = "http://www.missfit.ru/i/4215472799.jpg";
string sFileName = "my.jpg";

struct CapFile cap_file = {sFileName.c_str(), NULL};

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CapWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cap_file);
curl_easy_setopt(curl, CURLOPT_URL, sUrl.c_str());
curl_easy_perform(curl);
int i;
std::cin >> i;
return 0;


}

Ra$cal
25.04.2010, 23:23
не "сапсибо" говорить надо, а "я больше не буду задавать глупые вопросы не погуглив их"

eldar85
25.04.2010, 23:29
согласен) в консоле пишет
failed writing received data to disk/application, из за чего может быть косяк то еще????

Ra$cal
25.04.2010, 23:49
раз в консоли - значит это ошибка самого курла. варианты какие - либо файл занят, либо файл не создался. проверяй результат fopen.

M_script_
25.04.2010, 23:50
может fclose(cap_file.stream); ?

eldar85
25.04.2010, 23:55
файл не создается вообще, и прописывал ему директорию на диск С и так пробывал одно название файла чтобы возле exe записывался, но файл так и не появился...

fclose(cap_file.stream); попробывал, не помогает...

Ra$cal
25.04.2010, 23:59
путь то так прописывал "C:\\img.jpg", юак вырублен, или прога под админскими правами, или папка не на диске C.

eldar85
26.04.2010, 00:00
вот еще что выдает
failed writing body (-1 != 1132)
failed writing received data to disk/application

Ra$cal
26.04.2010, 00:04
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}

дебаг придумали трусы? отладить не пробовал? приходится заниматься дебагом в уме. видимо срабатывает этот выход. курл же видимо ожидает запись всего блока данных. сталобыть файл не открыт. сталобыть кури проблемы с путями, правами.

eldar85
26.04.2010, 00:04
да так прописывал) папка с ехе на диске Е, а какая разница куда помещать файл? главное же указать правельно куда помещать этот файл и все...

M_script_
26.04.2010, 00:05
да так прописывал) папка с ехе на диске Е, а какая разница куда помещать файл? главное же указать правельно куда помещать этот файл и все...
Исходник показывай...

eldar85
26.04.2010, 00:07
[QUOTE]#include <curl/curl.h>
#include <QApplication>
#include <stdio.h>
#include <c++/iostream>
#include <c++/string>

struct CapFile
{
const char *filename;
FILE *stream;
};

//---------------------------------------------------------------------------
static size_t CapWrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct CapFile *out=(struct CapFile *)stream;
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}
return fwrite(buffer, size, nmemb, out->stream);

}


int main(int argc, char* argv[])
{
CURL* curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
string sUrl = "http://litprom.ru/img/404.gif";
string sFileName = "C:\\img.gif";

struct CapFile cap_file = {sFileName.c_str(), NULL};
curl_easy_setopt(curl, CURLOPT_HEADER, 0);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CapWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cap_file);
curl_easy_setopt(curl, CURLOPT_URL, sUrl.c_str());
curl_easy_perform(curl);

int i;
std::cin >> i;
// fclose(cap_file.stream);
return 0;


}

Ra$cal
26.04.2010, 00:13
1) fclose не там. хотя в принципе тут он все таки не нужен. повтороного открытия нет.
2) путь к файлу на момент вызова точно жив? не самый правильный вариант передавать указатель на содержимое string'a. Лучше в структуре поле завести длиной в 200 байтиков и хранить путь там.
3) Попробуй отдельно в мейне создать файл где нибудь не в глубине диска и записать туда что нибудь. Пока отдельно не получится заставить работать - курл тоже не взлетит.

eldar85
26.04.2010, 00:17
да путь сейчас попробывал вывести в консоль под конец. все нормально - путь жив)Лучше в структуре поле завести длиной в 200 байтиков и хранить путь там. это как???

Ra$cal
26.04.2010, 00:19
struct Dummy{
char filePath[200];
};

раз пуьт в консоль вывелся - значит все норм. сделай тестовую прогу, которая создает файл, пишет туда чтото, закрывает поток, открывает тот же файл и продолжает туда запись еще одного блока. заработает - прилепи к программе скачки картинки.

eldar85
26.04.2010, 00:24
вот спасибо и в правду в стринге не катит путь прописывать, написал путь так и заработало
char sFileName[200] = "E:\img.gif";

eldar85
26.04.2010, 00:26
одно смущает, я же получается путь указал на диск Е:\img.gif , а поместил он этот файл к ехе шнику...

Ra$cal
26.04.2010, 00:28
косую черту не экранировал

eldar85
26.04.2010, 00:29
а нет вот так все работает прекрастно
char sFileName[200] = "c:/img.gif";

Ra$cal
26.04.2010, 00:30
косую черту экранируй "C:\\img.gif"

eldar85
26.04.2010, 00:30
большое спасибо вам)) давно хотел научиться с курлом это делать, а приходилось Qtшными средствами, а сетью то в основном курлом пользуюсь))) еще раз спасибо))

eldar85
08.06.2010, 12:21
такой вопрос, хочу скачать не той же функцией не картинку а текстовой файл или еще какой нить и прога вылетает. картинку скачивает а другой файл не хочет. код тот же за исключением
char sFileName[200] = "c:/img.txt";
ну и файла самого который скачивается:
char sUrl[300] = "http://slil.ru/29288703/684267bf.4c0e9d58/12345.txt";
прога вылетает тут же.

eldar85
08.06.2010, 12:41
хотя вообще теперь ничего не загружается

POS_troi
08.06.2010, 13:55
out->stream=fopen(out->filename, "w");