gpt4 book ai didi

python - Google App Engine urlfetch 到 POST 文件

转载 作者:太空狗 更新时间:2023-10-30 01:30:39 24 4
gpt4 key购买 nike

我正在尝试从 GAE 中的应用程序向 torrage.com 发送文件。该文件在收到用户上传后存储在内存中。

我希望能够使用此处提供的 API 发布此文件: http://torrage.com/automation.php但是我在理解帖子正文应该如何编码时遇到了一些问题,我从 API 得到的最多是一条“文件为空”的消息。

最佳答案

我发现 torrage 的 API 文档在 POST 接口(interface)(与 SOAP 接口(interface)相对)上非常困惑,并且与他们还提供的示例 C 代码相冲突。在我看来,在他们的 PHP 帖子在线示例中,他们没有发送文件的内容(就像上面@kender 的回答没有发送它一样),而他们在 SOAP 示例和示例 C 代码中发送它。

C 示例的相关部分(它们如何计算您要传递给 urlfetch.fetch 的 header )是:

  snprintf(formdata_header, sizeof(formdata_header) - 1,
"Content-Disposition: form-data; name=\"torrent\"; filename=\"%s\"\n"
"Content-Type: " HTTP_UPLOAD_CONTENT_TYPE "\n"
"\n",
torrent_file);
http_content_len = 2 + strlen(content_boundary) + 1 + strlen(formdata_header) + st.st_size + 1 + 2 + strlen(content_boundary) + 3;
LTdebug("http content len %u\n", http_content_len);
snprintf(http_req, sizeof(http_req) - 1,
"POST /%s HTTP/1.1\n"
"Host: %s\n"
"User-Agent: libtorrage/" LTVERSION "\n"
"Connection: close\n"
"Content-Type: multipart/form-data; boundary=%s\n"
"Content-Length: %u\n"
"\n",
cache_uri, cache_host, content_boundary, http_content_len);

“application/x-bittorrent”是HTTP_UPLOAD_CONTENT_TYPEst.st_size 是包含所有文件数据的内存缓冲区中的字节数(C 示例从文件中读取该数据,但是如何将其放入内存并不重要,只要你知道它的大小)。 content_boundary 是文件内容中不存在的字符串,他们将其构建为 "-------------------- ----%u%uLT",每个 %u 替换为一个随机数(重复直到该字符串遇到两个随机数,使其不存在于文件中)。最后,帖子正文(在打开 HTTP 套接字并发送其他 header 之后)如下所示:

  if (write_error == 0) if (write(sock, "--", 2) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, "\n", 1) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, formdata_header, strlen(formdata_header)) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, filebuf, st.st_size) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, "\n--", 3) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, content_boundary, strlen(content_boundary)) <= 0) write_error = 1;
if (write_error == 0) if (write(sock, "--\n", 3) <= 0) write_error = 1;

其中 filebuf 是包含文件内容的缓冲区。

不够清晰和简单,但我希望这里有足够的信息来找出一种方法来为 urlfetch.fetch 构建参数(为 urllib.urlopen 构建参数) > 会同样困难,因为问题是缺乏关于确切的 header 和内容以及您需要的编码方式的文档——而且那些没有很好记录的信息需要从我在这里展示的内容进行逆向工程,我认为)。

或者,可以通过 urlfetch 破解 SOAP 请求;见here感谢卡森在这件事上的尝试、困难和成功。还有,祝你好运!

关于python - Google App Engine urlfetch 到 POST 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1438542/

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