如何在C++中使用文件指针来卷曲文件
我有一个文件指针,如下所示:如何在C++中使用文件指针来卷曲文件,c++,curl,unix,libcurl,C++,Curl,Unix,Libcurl,我有一个文件指针,如下所示: FILE* f = tmpfile() 如何使用libcurl作为名为F1的字段向URL发送HTTP POST 我尝试将文件内容读入char*数组,但使用了以下方法进行上传: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <curl/curl.h> #include <curl/types.h> #include
FILE* f = tmpfile()
如何使用libcurl作为名为F1的字段向URL发送HTTP POST
我尝试将文件内容读入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会有二进制内容。HTTP POST可以通过多种方式完成,因此除非您在问题中详细说明,否则没有一个答案。使用libcurl以编程方式进行POST的一种方法如下例所示: 如果您更希望执行多部分formpost上载,可能更好的示例如下:
HTTP POST可以通过多种方式完成,因此除非您在问题中指定更多细节,否则不会有单一答案。使用libcurl以编程方式进行POST的一种方法如下例所示: 如果您更希望执行多部分formpost上载,可能更好的示例如下:
你上传的代码很好用。上载的文件存储在临时文件/tmp/phpyOiqXh中。PHP不会将上传文件的内容存储到变量中,只存储临时文件的路径 您上传的代码工作正常。上载的文件存储在临时文件/tmp/phpyOiqXh中。PHP不会将上传文件的内容存储到变量中,只存储临时文件的路径 没有文件标识符这样的东西。这是一个文件指针。你能解释一下你想贴什么吗?文件的内容是什么?文件名?文件是MP4视频文件。上面的命令用于创建文件。没有文件标识符。这是一个文件指针。你能解释一下你想贴什么吗?文件的内容是什么?文件名?该文件是MP4视频文件。上面的命令用于创建该文件。多部分示例使用文件名,但我只有一个文件指针。那么,还有别的办法吗?或者第一种方法是唯一的方法?您也可以使用CURLFORM_STREAM或CURLFORM_BUFFER,这取决于您的首选项。多部分示例使用文件名,但我只有一个文件指针。那么,还有别的办法吗?或者第一种方法是唯一的方法?您也可以使用CURLFORM\u流或CURLFORM\u缓冲区,这取决于您的偏好。