Wie kann ich CURL POST eine Datei mit dem Datei-Zeiger in C++
Ich habe einen file-Zeiger, wie die folgenden:
FILE* f = tmpfile()
Wie verwende ich libcurl dazu eine HTTP-POST an eine URL ein Feld namens F1?
Ich habe versucht, Lesen den Inhalt der Datei in ein char* array aber und verwendet das folgende hochladen:
#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;
}
Die Ausgabe, die ich bekomme, ist
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
Ich hatte erwartet, Sie F1, um binäre Inhalte.
Es gibt keine solche Sache wie ein "Datei-Id". Es ist eine Datei Zeiger.
Könnten Sie bitte erklären, was Sie buchen möchten? Der Inhalt der Datei? Der name der Datei?
Die Datei ist eine MP4-video-Datei.Der obige Befehl wird verwendet, um die Datei zu erstellen.
Könnten Sie bitte erklären, was Sie buchen möchten? Der Inhalt der Datei? Der name der Datei?
Die Datei ist eine MP4-video-Datei.Der obige Befehl wird verwendet, um die Datei zu erstellen.
InformationsquelleAutor Ankur Chauhan | 2010-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen HTTP-POST kann in vielerlei Hinsicht getan werden, damit es nicht eine einzelne Antwort, es sei denn, Sie geben Sie mehr details in der Frage. Ein Weg, um die POST zu tun programmgesteuert mit libcurl ist wie in diesem Beispiel gezeigt:
http://curl.haxx.se/libcurl/c/post-callback.html
Wenn Sie lieber wollen, eine mehrteilige formpost hochladen, vielleicht ein besseres Beispiel ist dieses:
http://curl.haxx.se/libcurl/c/postit2.html
Sie können CURLFORM_STREAM oder CURLFORM_BUFFER wie gut, je nach Ihren Vorlieben.
CURLFORM_BUFFER scheint, den trick zu tun!
InformationsquelleAutor Daniel Stenberg
Ihnen das hochladen von code, funktioniert einwandfrei. Die hochgeladene Datei ist gespeichert in einer temporären Datei /tmp/phpyOiqXh. PHP wird nicht speichern Sie den Inhalt der hochgeladenen Datei in einer Variablen speichern nur die temp Datei Pfad.
InformationsquelleAutor LeonQiu