![]() |
как скачать картинку в файл с помощью libcurl?
не могу понять в как в курле скачивать картинку с сайта какого либо в файл, чтобы можно было к примеру на диск С скачать картинку...
можете помочь?) очень нужно... |
так
PHP код:
PHP код:
|
ого как быстро ответили)) большое вам спасибо)))
|
блин, чет я кажется не то наделал, подскажите пожалуйста где накосячил то??
Цитата:
|
Цитата:
|
тоесть как будет называться сама картинка после скачиваания?))
|
а что значит "wb" ???)
|
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
|
спасибо...)
вот сделал так, по идее должен же скачать файл и поместить возле экзэшника, но ничего нету... Цитата:
|
не "сапсибо" говорить надо, а "я больше не буду задавать глупые вопросы не погуглив их"
|
согласен) в консоле пишет
failed writing received data to disk/application, из за чего может быть косяк то еще???? |
раз в консоли - значит это ошибка самого курла. варианты какие - либо файл занят, либо файл не создался. проверяй результат fopen.
|
может 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; } дебаг придумали трусы? отладить не пробовал? приходится заниматься дебагом в уме. видимо срабатывает этот выход. курл же видимо ожидает запись всего блока данных. сталобыть файл не открыт. сталобыть кури проблемы с путями, правами. |
да так прописывал) папка с ехе на диске Е, а какая разница куда помещать файл? главное же указать правельно куда помещать этот файл и все...
|
Цитата:
|
[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) Попробуй отдельно в мейне создать файл где нибудь не в глубине диска и записать туда что нибудь. Пока отдельно не получится заставить работать - курл тоже не взлетит. |
да путь сейчас попробывал вывести в консоль под конец. все нормально - путь жив)
Цитата:
|
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"; прога вылетает тут же. |
хотя вообще теперь ничего не загружается
|
Код:
out->stream=fopen(out->filename, "w"); |
| Время: 01:46 |