2010-11-23 6 views
2

brauche ich eine Möglichkeit, eine Datei zu laden und per Post in PHP-SeiteHochladen und POST-Datei auf PHP-Seite

die PHP auf Apache-Server sind

und ich verwende diesen C-Code in meiner Desktop-Anwendung:

Es ist ein Sockel von c-Code

Wenn ich das Programm ausführen,

Größe

die Datei erhalten kann, ist 772.906 offener Server ok Die Dateigröße ist 772906 Verbindung zum Server ok Datei öffnen ok fread 102400 Bytes, Senden 102.400 Bytes fread 102400 Bytes, Senden 102.400 Bytes fread 102400 Bytes, Senden 102.400 Bytes fread 102400 Bytes, Senden 102.400 Bytes 102400 fread Bytes, Senden 102400 Bytes fred 102400 Bytes, Senden 102400 Bytes fred 102400 Bytes, Senden 102400 Bytes fread 56106 Bytes, Senden 56106 Bytes Datei wird gesendet Fertig! Ergebnis: Return-Code:
Upload:
Typ:
Größe: 0 Kb
Temp-Datei:
in Stored:

Aber Datei ist nicht vorhanden.

Ich denke, vielleicht ist es möglich HTTP-Protokoll, aber ich weiß nicht, wie es geht.

Würden Sie mir Details sagen?

Vielen Dank.

#include <stdio.h> 

#include <stdlib.h> 

#include <errno.h> 

#include <string.h> 

#include <unistd.h> 

#include <pthread.h> 

#include <netinet/in.h> 

#include <sys/socket.h> 

#include <sys/wait.h> 

#include <sys/types.h> 

#include <sys/stat.h> 

#include <arpa/inet.h> 





int main(){ 



    int sockfd, numbytes; 

    FILE *fp; 

    char buf[300]; 

    char filename[10]="1.jpg"; 

    char send1[100]; 

    struct sockaddr_in address; 

    struct stat filestat; 

    int retval; 

    char *str="GET /some address/upload_file.php?"; 



    //Get file stat 

    if (lstat(filename, &filestat) < 0){ 

     exit(1); 

    } 

    printf("The file size is %lu\n", filestat.st_size); 



    //TCP socket 

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ 

     perror("socket"); 

     exit(1); 

    }else{ 

    printf("open server ok\n"); 

    } 



    #if 1 

     //Initial, connect to port 80 

     address.sin_family = AF_INET; 

     address.sin_port = htons(80); 

     address.sin_addr.s_addr = inet_addr("xx.xx.xx.xx"); 

     bzero(&(address.sin_zero), 8); 

    #endif 



    //Get file stat 
    if (lstat("1.jpg", &filestat) < 0){ 
     exit(1); 
    } 
    printf("The file size is %lu\n", filestat.st_size); 
    fp = fopen("1.jpg", "rb"); 

    //Connect to server 

    if (connect(sockfd, (struct sockaddr*)&address, sizeof(struct sockaddr)) == -1){ 

     perror("connect"); 

     exit(1); 

    }else{ 

    printf("Connect to server ok\n"); 

    } 



    if ((fp = fopen(filename,"rb")) == NULL){ 

      perror("fopen"); 

      exit(1); 

    }else{ 

    printf("Open file ok\n"); 

    } 



    sprintf(send1,"%s\n",str); 

    retval= send(sockfd,send1,sizeof(send1),0); 





    //Sending file 

    while(!feof(fp)){ 
     numbytes = fread(buf, sizeof(char), sizeof(buf), fp); 
     //printf("fread %d bytes, ", numbytes); 
     numbytes = write(sockfd, buf, numbytes); 
     //printf("Sending %d bytes\n",numbytes); 
    } 

    printf("Sending file Finished!\n"); 



    //Receive from server 

    if ((numbytes = recv(sockfd, buf, sizeof(buf)+1,0)) == -1){ 

      perror("recv"); 

      exit(1); 

     } 

    printf("result: %s\n\n\n", buf); 



    fclose(fp); 

    close(sockfd); 

    return 0; 

} 

mein PHP ist:

<?php 





if (1){ 



if ($_FILES["file"]["error"] > 0){ 

     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 

    }else{ 

     echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 

     echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 

     echo "Type: " . $_FILES["file"]["type"] . "<br />"; 

     echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 

     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 



     //move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]); 
     move_uploaded_file($_FILES["file"]["tmp_name"], "5446"); 

     echo "Stored in: " . $_FILES["file"]["name"]; 



    } 



}else{ 

    echo "Invalid file"; 

} 

?> 

Antwort

2

Wenn Sie eine Datei hochladen möchten Sie mit POST beginnen sollte /file/to/somewhere.php nicht bekommen.

Wenn Sie das Protokoll sehen wollen, können Sie entweder HTTP-Spezifikationen lesen oder sogar besser, wireshark installieren und den Upload mit einem Browser durchführen. Dann können Sie in wireshark sehen, welche Nachrichten vom Browser gesendet werden und diese nur mit Ihrem Programm replizieren.

IIRC sollte das Protokoll wie folgt aussehen:

POST /to/somewhere.php HTTP/1.1 
Host: www.yourserver.com 
Content-Type: multipart/form-data;boundary=fdhskjfhldjkshfdksl---- 

fdhskjfhldjkshfdksl---- 
Content-Disposition: name=data;filename=foo.jpg 
Content-Type: image/jpg 

<binary data here> 

Ich schreibe dies aus meinem Kopf, so dass Sie wirklich der Browser es tun sollte aufpassen, aber das ist die allgemeine Vorstellung davon, wie Post funktioniert.

0

Dies ist interessant ...
ich denke, die PHP (Server-Seite) für einen Körper wartet die Formulardaten enthält, und innerhalb dieser Formulardaten (die übrigens explizit erwähnt wurden vielgestaltig und nicht nur zu sein test) gibt es binäre Daten einer Datei.
Kann ich einen anderen Stamm zum Hochladen Ihrer Dateien vorschlagen? Wie wäre es mit ftp die Datei, und auf der Server-Seite mit einem Cron-Job, der das Verzeichnis, in das die Datei hochgeladen wurde, scannt und führt die PHP-Validierung erforderlich, dann verschieben Sie es an den gewünschten Speicherort. Wenn Sie über die unsynchronisierte Art dieser Lösung besorgt sind, führen Sie diesen Cron alle paar Sekunden aus (vorausgesetzt, der Validierungscode ist kurz und einfach).

Hoffe, das hilft.