2010-04-17 6 views
1

J'ai un pointeur de fichier, comme les suivantes:Comment puis-je Flexion un fichier en utilisant le pointeur de fichier dans C++

FILE* f = tmpfile() 

Comment puis-je utiliser libcurl pour faire un HTTP POST à ​​une URL comme un champ nommé F1?

J'ai essayé de lire le contenu du fichier dans un tableau char * mais et utilisé les éléments suivants pour télécharger:

#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; 
} 

La sortie que je reçois est

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 

Je me attendais F1 à avoir binaire contenu.

+0

Il n'existe pas d'identificateur de fichier. C'est un fichier * pointeur *. –

+0

Pourriez-vous expliquer ce que vous voulez publier? Le contenu du fichier? Le nom du fichier? –

+0

Le fichier est un fichier vidéo MP4. La commande ci-dessus est utilisée pour créer le fichier. –

Répondre

4

Un POST HTTP peut être effectué de plusieurs façons. Il n'y a donc pas de réponse unique à moins de spécifier plus de détails dans la question. Une façon de faire POST programme avec libcurl est comme indiqué dans cet exemple:

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

Si vous voulez plutôt faire un téléchargement multipart formpost, peut-être un meilleur exemple est la suivante:

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

+0

L'exemple multipart utilise un nom de fichier mais la seule chose que j'ai est un pointeur de fichier. Alors, y a-t-il un autre moyen de le faire? ou est le premier le seul moyen? –

+0

Vous pouvez également utiliser CURLFORM_STREAM ou CURLFORM_BUFFER, selon vos préférences. –

+0

CURLFORM_BUFFER semble faire l'affaire! –

0

Vous téléchargez le code fonctionne très bien. Le fichier téléchargé est stocké dans un fichier temporaire/tmp/phpyOiqXh. PHP ne stockera pas le contenu du fichier téléchargé dans une variable, il suffit de stocker le chemin du fichier temporaire.