ftpuploadfrommem.c
/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * * SPDX-License-Identifier: curl * ***************************************************************************/ /* <DESC> * FTP upload a file from memory * </DESC> */ #include <stdio.h> #include <string.h> #include <curl/curl.h> static const char data[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " "___ rhoncus odio id venenatis volutpat. Vestibulum dapibus " "bibendum ullamcorper. Maecenas finibus elit augue, vel " "condimentum odio maximus nec. In hac habitasse platea dictumst. " "Vestibulum vel dolor et turpis rutrum finibus ac at nulla. " "Vivamus nec neque ac elit blandit pretium vitae maximus ipsum. " "Quisque sodales magna vel erat auctor, sed pellentesque nisi " "rhoncus. Donec vehicula maximus pretium. Aliquam eu tincidunt " "lorem."; struct WriteThis { const char *readptr; size_t sizeleft; }; static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp) { struct WriteThis *upload = (struct WriteThis *)userp; size_t max = size * nmemb; if(max < 1) return 0; if(upload->sizeleft) { size_t copylen = max; if(copylen > upload->sizeleft) copylen = upload->sizeleft; memcpy(ptr, upload->readptr, copylen); upload->readptr += copylen; upload->sizeleft -= copylen; return copylen; } return 0; /* no more data left to deliver */ } int main(void) { CURL *curl; CURLcode result; struct WriteThis upload; upload.readptr = data; upload.sizeleft = strlen(data); /* In Windows, this inits the Winsock stuff */ result = curl_global_init(CURL_GLOBAL_DEFAULT); /* Check for errors */ if(result != CURLE_OK) { fprintf(stderr, "curl_global_init() failed: %s\n", curl_easy_strerror(result)); return 1; } /* get a curl handle */ curl = curl_easy_init(); if(curl) { /* First set the URL, the target file */ curl_easy_setopt(curl, CURLOPT_URL, "ftp://example.com/path/to/upload/file"); /* User and password for the FTP login */ curl_easy_setopt(curl, CURLOPT_USERPWD, "login:secret"); /* Now specify we want to UPLOAD data */ curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* we want to use our own read function */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb); /* pointer to pass to our read function */ curl_easy_setopt(curl, CURLOPT_READDATA, &upload); /* get verbose debug output please */ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); /* Set the expected upload size. */ curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)upload.sizeleft); /* Perform the request, result gets the return code */ result = curl_easy_perform(curl); /* Check for errors */ if(result != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result)); /* always cleanup */ curl_easy_cleanup(curl); } curl_global_cleanup(); return (int)result; }
Notice
This source code example is simplified and may ignore return
codes and error checks. We do this to highlight the libcurl function calls and
related options and reduce unrelated code.
A real-world application does of course properly check every return value and exit correctly at the first serious error.