怎么用libcurl实现ftp断点续传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用libcurl实现ftp断点续传相关的知识,希望对你有一定的参考价值。

如何用libcurl实现ftp断点续传
如题,在libcurl官网上找了一个上传函数,但测试无法实现
int upload(CURL *curlhandle, const char * remotepath, const char * localpath, long timeout, long tries)

FILE *f;
long uploaded_len = 0;
CURLcode r = CURLE_GOT_NOTHING;
int c;
f = fopen(localpath, "rb");
if (f == NULL)
perror(NULL);
return 0;

curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
curl_easy_setopt(curlhandle, CURLOPT_USERPWD, "spider:spider");
if (timeout)
curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
for (c = 0; (r != CURLE_OK) && (c < tries); c++)
/* are we resuming */
if (c) /* yes */
/* determine the length of the file already written */
/*
* With NOBODY and NOHEADER, libcurl will issue a SIZE
* command, but the only way to retrieve the result is
* to parse the returned Content-Length header. Thus,
* getcontentlengthfunc(). We need discardfunc() above
* because HEADER will dump the headers to stdout
* without it.
*/
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
r = curl_easy_perform(curlhandle);
if (r != CURLE_OK)
continue;
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
fseek(f, uploaded_len, SEEK_SET);
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);

else /* no */
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);

r = curl_easy_perform(curlhandle);

fclose(f);
if (r == CURLE_OK)
return 1;
else
fprintf(stderr, "%s\n", curl_easy_strerror(r));
return 0;

参考技术A 这个需要FTP server支持append,我之前用它的命令行测试过的,libcurl可以实现断点续传。

以上是关于怎么用libcurl实现ftp断点续传的主要内容,如果未能解决你的问题,请参考以下文章

Python实现支持并发断点续传的FTP

chrome 怎么http断点续传

第五十六节,python实现支持并发断点续传的Ftp程序

用java向hdfs上传文件时,如何实现断点续传

http断点续传Range与Content-Range

OSS android 断点续传,不知道怎么上传文件写入内存,没有被回收掉