gpt4 book ai didi

c - 是否可以使用 libcurl 同时下载和发布 multipart/form-data 相同的文件?

转载 作者:行者123 更新时间:2023-12-04 07:25:15 24 4
gpt4 key购买 nike

鉴于我正在试验 ,这也许是一个愚蠢的问题。 libcurl ,也可能是无法做到的情况。让我首先向您描述我想要实现的行为。
假设我想下载一些文件,我可以逐个请求这个文件,直到我得到整个文件。现在,不是将这些数据存储到临时文件中,而是每次我获得这些片段或块中的一个时,我想将此片段上传到另一台服务器。两个服务器都是 HTTP 服务器,第二个只接受文件的上传,使用带有 multipart/form-data 的 POST .
我有一个想法,但我无法让它发挥作用,而且仍然不确定是否可行。我的想法是模仿我在此 question 中找到的解决方案,但在这里他们使用命令行 curl 第二台服务器是 FTTP 服务器。
所以想法是创建一个管道,并使用这个管道将碎片传递给负责上传的部分。让我们给你看一个草图,以防你在我糟糕的英语中迷路:
data flow
也许是 管道 根本不需要,因为 libcurl 允许您访问这些正在下载的数据块,例如 getinmemory example ,但我不知道是否可以将这些碎片传递给一个 multipart/form-data请求,无需将数据存储到文件中,然后告诉 libcurl 上传该文件。
正如我之前所说,我尝试使管道的这种解决方案起作用,但无法使其起作用。让我展示我不完整的代码,让你得到一个具体的想法:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <curl/curl.h>

#define WE 1
#define RE 0



/*down_up video*/
CURLcode down_up(void)
{
CURLcode ret;
const char *url_down = "http://localhost:4000/static/videos/1.mp4";
const char *url_up = "http://localhost:4000/upload";

int pdf[2]; /*write end and read end*/

if(pipe(pdf) == -1)
errExit("pipe");

pid_t pid = fork();
switch(pid) {
case -1:
errExit("ok");
case 0:
/*closing unused WE in child proccess*/
if(close(pdf[WE]) == -1)
errExit("Close");
break;
default:
/*parent process*/
/*closing the RE on parent proccess*/
if(close(pdf[RE]) == -1)
errExit("Close");
break;
}

switch(pid) {
case -1:
errExit("ok");
case 0:
/*child process*/
CURL *curl_up;
curl_up = curl_easy_init();
curl_easy_setopt(curl_up, CURLOPT_URL, url_up);
/*upload file with multipart/form-data, reading chunks from pipe*/

break;
default:
/*parent process*/
CURL *curl_down;
curl_down = curl_easy_init();
curl_easy_setopt(curl_down, CURLOPT_URL, url_down);
/*download file, and writing pieces into the pipe*/

break;
}


curl_easy_cleanup(curl_down);
curl_easy_cleanup(curl_up);
curl_down = NULL;
curl_up = NULL;
return ret;
}

int main(void)
{
CURLcode ret;
ret = download_upload();
if(ret != CURLE_OK)
return 1;
return 0;
}

在这里,我尝试使用 parent process 下载,并使用 child process 上传.为了将数据从父进程传递到子进程,我关闭了 阅读结束(RE) PIPE 的 parent process ,并关闭 写完(WE) PIPE 的 child process .我们得到这样的东西:
pipe after fork
但仍然不知道如何协调这一切。这甚至可能吗?

最佳答案

是的,这当然是可能的。
可以使基本功能像这样工作。两个线程:

  • 文件的下载将其存储在内存中,或多或少地附加到缓冲区中。我们称之为“下载缓冲区”。如果下载缓冲区变得太大,现实生活中的实现可能会暂停传输。即如果上传方比下载方慢得多。
  • 以多部分形式上传文件是在一个单独的线程中完成的,并使用 libcurl 的 CURLOPT_MIMEPOST创建帖子正文的选项。从内存上传文件的部分是用 curl_mime_data_cb 创建的,以便在 libcurl 需要为该部分上传数据时调用您提供的回调函数。然后,您的回调将提供第 1 步中提到的“下载缓冲区”中的数据。如果没有可用数据,则回调可能只是等到有数据后再返回。
  • 关于c - 是否可以使用 libcurl 同时下载和发布 multipart/form-data 相同的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68240299/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com