0

I am doing a project and it's first step includes to download an image from an url and save it a some location.Further processing will be done on that image at the later stage.For this purpose I am using curl libraries in visual studio along with opencv.I am new to using curl libraries.I saw an answer here. But, I can't understand it.Here is my code

#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#include <string>

size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream)
{
    size_t written;
    written = fwrite(ptr, size, nmemb, stream);
    return written;
}

int main(void)
{
    CURL* curl;
    FILE* fp;
    CURLcode res;
    char* url = "http://pimg.tradeindia.com/01063301/b/1/CRO-Oscilloscope.jpg";
    char outfilename[FILENAME_MAX] = "C:\\bbb.jpg";
    curl = curl_easy_init();
    if (curl)
    {
        fp = fopen(outfilename, "wb");
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        res = curl_easy_perform(curl);
        /* always cleanup */
        curl_easy_cleanup(curl);
        fclose(fp);
    }
    return 0;
}

Thanks for the help.

273K
  • 29,503
  • 10
  • 41
  • 64

2 Answers2

0
#include <stdio.h>
#include <curl/curl.h>

size_t callbackfunction(void *ptr, size_t size, size_t nmemb, void* userdata)
{
    FILE* stream = (FILE*)userdata;
    if (!stream)
    {
        printf("!!! No stream\n");
        return 0;
    }

    size_t written = fwrite((FILE*)ptr, size, nmemb, stream);
    return written;
}

bool download_jpeg(char* url)
{
    FILE* fp = fopen("out.jpg", "wb");
    if (!fp)
    {
        printf("!!! Failed to create file on the disk\n");
        return false;
    }

    CURL* curlCtx = curl_easy_init();
    curl_easy_setopt(curlCtx, CURLOPT_URL, url);
    curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, fp);
    curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction);
    curl_easy_setopt(curlCtx, CURLOPT_FOLLOWLOCATION, 1);

    CURLcode rc = curl_easy_perform(curlCtx);
    if (rc)
    {
        printf("!!! Failed to download: %s\n", url);
        return false;
    }

    long res_code = 0;
    curl_easy_getinfo(curlCtx, CURLINFO_RESPONSE_CODE, &res_code);
    if (!((res_code == 200 || res_code == 201) && rc != CURLE_ABORTED_BY_CALLBACK))
    {
        printf("!!! Response code: %d\n", res_code);
        return false;
    }

    curl_easy_cleanup(curlCtx);

    fclose(fp);

    return true;
}

int main(int argc, char** argv)
{
    if (argc < 2)
    {
       printf("Usage: %s <url>\n", argv[0]);
       return -1;
    }

    if (!download_jpeg(argv[1]))
    {
        printf("!! Failed to download file: %s\n", argv[1]);
        return -1;
    }

    return 0;
}

What about this??

maxadorable
  • 1,290
  • 1
  • 10
  • 24
  • I don't understand the code in terms of argc and argv. Can you explain without using them? –  Apr 18 '16 at 19:55
  • When I compiled the above code, it is returning -1.Seems like argc<1 –  Apr 18 '16 at 19:55
0

I don't understand the code in terms of argc and argv. Can you explain without using them? – john smith

They're used to pass command line arguments when you start the program. argv is a double pointer to an array of cstrings and argc is the number of cstrings. argv[0] in this case would be the name of the executable and argv[1] would be the URL of the image to download. i.e. foo.exe http://path/to/image.jpg

Sean Davis
  • 16
  • 2