Просмотр полной версии : как скачать картинку в файл с помощью libcurl?
не могу понять в как в курле скачивать картинку с сайта какого либо в файл, чтобы можно было к примеру на диск С скачать картинку...
можете помочь?) очень нужно...
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);
ого как быстро ответили)) большое вам спасибо)))
блин, чет я кажется не то наделал, подскажите пожалуйста где накосячил то??
#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 - имя файла
тоесть как будет называться сама картинка после скачиваания?))
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
спасибо...)
вот сделал так, по идее должен же скачать файл и поместить возле экзэшника, но ничего нету...
#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;
}
не "сапсибо" говорить надо, а "я больше не буду задавать глупые вопросы не погуглив их"
согласен) в консоле пишет
failed writing received data to disk/application, из за чего может быть косяк то еще????
раз в консоли - значит это ошибка самого курла. варианты какие - либо файл занят, либо файл не создался. проверяй результат fopen.
M_script_
25.04.2010, 23:50
может fclose(cap_file.stream); ?
файл не создается вообще, и прописывал ему директорию на диск С и так пробывал одно название файла чтобы возле exe записывался, но файл так и не появился...
fclose(cap_file.stream); попробывал, не помогает...
путь то так прописывал "C:\\img.jpg", юак вырублен, или прога под админскими правами, или папка не на диске C.
вот еще что выдает
failed writing body (-1 != 1132)
failed writing received data to disk/application
if(out && !out->stream)
{
out->stream=fopen(out->filename, "wb");
if(!out->stream)
return -1;
}
дебаг придумали трусы? отладить не пробовал? приходится заниматься дебагом в уме. видимо срабатывает этот выход. курл же видимо ожидает запись всего блока данных. сталобыть файл не открыт. сталобыть кури проблемы с путями, правами.
да так прописывал) папка с ехе на диске Е, а какая разница куда помещать файл? главное же указать правельно куда помещать этот файл и все...
M_script_
26.04.2010, 00:05
да так прописывал) папка с ехе на диске Е, а какая разница куда помещать файл? главное же указать правельно куда помещать этот файл и все...
Исходник показывай...
[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;
}
1) fclose не там. хотя в принципе тут он все таки не нужен. повтороного открытия нет.
2) путь к файлу на момент вызова точно жив? не самый правильный вариант передавать указатель на содержимое string'a. Лучше в структуре поле завести длиной в 200 байтиков и хранить путь там.
3) Попробуй отдельно в мейне создать файл где нибудь не в глубине диска и записать туда что нибудь. Пока отдельно не получится заставить работать - курл тоже не взлетит.
да путь сейчас попробывал вывести в консоль под конец. все нормально - путь жив)Лучше в структуре поле завести длиной в 200 байтиков и хранить путь там. это как???
struct Dummy{
char filePath[200];
};
раз пуьт в консоль вывелся - значит все норм. сделай тестовую прогу, которая создает файл, пишет туда чтото, закрывает поток, открывает тот же файл и продолжает туда запись еще одного блока. заработает - прилепи к программе скачки картинки.
вот спасибо и в правду в стринге не катит путь прописывать, написал путь так и заработало
char sFileName[200] = "E:\img.gif";
одно смущает, я же получается путь указал на диск Е:\img.gif , а поместил он этот файл к ехе шнику...
косую черту не экранировал
а нет вот так все работает прекрастно
char sFileName[200] = "c:/img.gif";
косую черту экранируй "C:\\img.gif"
большое спасибо вам)) давно хотел научиться с курлом это делать, а приходилось Qtшными средствами, а сетью то в основном курлом пользуюсь))) еще раз спасибо))
такой вопрос, хочу скачать не той же функцией не картинку а текстовой файл или еще какой нить и прога вылетает. картинку скачивает а другой файл не хочет. код тот же за исключением
char sFileName[200] = "c:/img.txt";
ну и файла самого который скачивается:
char sUrl[300] = "http://slil.ru/29288703/684267bf.4c0e9d58/12345.txt";
прога вылетает тут же.
хотя вообще теперь ничего не загружается
POS_troi
08.06.2010, 13:55
out->stream=fopen(out->filename, "w");
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot