【问题标题】:How can I CURL POST a file using file pointer in C++如何使用 C++ 中的文件指针 CURL POST 文件
【发布时间】:2010-04-17 05:07:55
【问题描述】:

我有一个文件指针,如下:

FILE* f = tmpfile()

如何使用 libcurl 将 HTTP POST 作为名为 F1 的字段发送到 URL?

我尝试将文件内容读入 char* 数组,但使用以下内容上传:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

char* dump_buffer(void *buffer, int buffer_size){
int i;
char *ch = malloc(buffer_size);
for(i = 0;i < buffer_size;++i){
    ch[i] = ((char *)buffer)[i];
    //printf("%c",((char *)buffer)[i]);
}
return ch;
}

char* readFileBytes(const char *name){
FILE *file;
char *buffer;
unsigned long fileLen;
int i;
file = fopen("index.tar", "rb");
if (!file)
{
    fprintf(stderr, "can't open file %s", "1.m4v");
    exit(1);
}

fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);

buffer=(char *)malloc(fileLen+1);

if (!buffer)
{
    fprintf(stderr, "Memory error!");
    fclose(file);
    exit(1);
}

fread(buffer, fileLen, 1, file);
fclose(file);
char* ret = dump_buffer(&buffer, fileLen);

for(i = 0;i < fileLen;++i){
    //printf("%c",ret[i]);
}

return ret;
}


int main(int argc, char *argv[])
{
  CURL *curl;
  CURLcode res;

  struct curl_httppost *formpost=NULL;
  struct curl_httppost *lastptr=NULL;
struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "Content-Type: multipart/form-data");

  curl_global_init(CURL_GLOBAL_ALL);

  /* Fill in the filename field */

char* p = readFileBytes("index.tar");

curl_formadd(&formpost,
             &lastptr,
             CURLFORM_COPYNAME, "F2",
             CURLFORM_FILE, "index.tar",
             CURLFORM_END);

curl_formadd(&formpost,
             &lastptr,
             CURLFORM_COPYNAME, "F1",
             CURLFORM_COPYCONTENTS, (char*)p,
             CURLFORM_END);
curl = curl_easy_init();
  /* initalize custom header list (stating that Expect: 100-continue is not
 wanted */
  if(curl) {
/* what URL that receives this POST */
  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "http://oceanfizz.usc.edu/upload.php");
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
res = curl_easy_perform(curl);

/* always cleanup */
curl_easy_cleanup(curl);

/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
  }
  return 0;
}

我得到的输出是

guest-wireless-207-151-246-070:Desktop ankurcha$ ./postit2
* About to connect() to oceanfizz.usc.edu port 80 (#0)
*   Trying 128.125.49.29... * connected
* Connected to oceanfizz.usc.edu (128.125.49.29) port 80 (#0)
> POST /upload.php HTTP/1.1
Host: oceanfizz.usc.edu
Accept: */*
Content-Length: 20770
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------e04b6194f620

< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Mon, 19 Apr 2010 03:51:04 GMT
< Server: Apache/2.2.12 (Ubuntu)
< X-Powered-By: PHP/5.2.10-2ubuntu6.4
< Vary: Accept-Encoding
< Content-Length: 335
< Content-Type: text/html
< 
array(1) {
  ["F2"]=>
  array(5) {
["name"]=>
string(9) "index.tar"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(14) "/tmp/phpyOiqXh"
["error"]=>
int(0)
["size"]=>
int(20480)
  }
}
array(1) {
  ["F1"]=>
  string(0) ""
}
Sorry, there was a problem uploading your file. 
* Connection #0 to host oceanfizz.usc.edu left intact
* Closing connection #0

我期待 F1 包含二进制内容。

【问题讨论】:

  • 没有“文件标识符”之类的东西。它是一个文件指针
  • 您能解释一下您要发布的内容吗?文件的内容?文件名?
  • 该文件是一个MP4视频文件。上面的命令用于创建文件。

标签: c++ curl unix libcurl


【解决方案1】:

HTTP POST 可以通过多种方式完成,因此除非您在问题中指定更多详细信息,否则没有单一答案。使用 libcurl 以编程方式执行 POST 的一种方法如下例所示:

http://curl.haxx.se/libcurl/c/post-callback.html

如果您想进行多部分表单上传,可能是一个更好的例子:

http://curl.haxx.se/libcurl/c/postit2.html

【讨论】:

  • 多部分示例使用文件名,但我唯一拥有的是文件指针。那么,还有其他方法可以做到这一点吗?还是第一个是唯一的方法?
  • 您也可以使用 CURLFORM_STREAM 或 CURLFORM_BUFFER,这一切都取决于您的喜好。
【解决方案2】:

您上传的代码工作正常。上传的文件存储在临时文件 /tmp/phpyOiqXh 中。 PHP不会将上传文件的内容存储到变量中,只存储临时文件的路径。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2021-11-06
    • 2019-12-09
    • 1970-01-01
    • 2023-03-11
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多