Upload and POST file to PHP page

2019-05-21 01:53发布

I need a way to upload a file and POST it into php page

the php is on apache server

and i use this c code in my desktop application:

It's a socket by c code

When I execute the Program , can get

The file size is 772906 open server ok The file size is 772906 Connect to server ok Open file ok fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 102400 bytes, Sending 102400 bytes fread 56106 bytes, Sending 56106 bytes Sending file Finished! result: Return Code:
Upload:
Type:
Size: 0 Kb
Temp file:
Stored in:

But file is not exist .

I guess maybe it's possible HTTP protocol ,But I don't know how to do.

would you tell me details ?

Thanks a lot.

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

} 

my php is :

<?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"; 

} 

?>

2条回答
Ridiculous、
2楼-- · 2019-05-21 02:16

If you want to upload a file you should begin with POST /file/to/somewhere.php not GET.

If you want to see the protocol, you could either read up on HTTP specs or even better, install wireshark and do the upload with a browser. Then you can see in wireshark which messages are sent by the browser and just replicate these with your program.

IIRC the protocol should look like this:

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>

I'm typing this from my head so you really should watch the browser do it, but that's the general idea of how post works.

查看更多
Deceive 欺骗
3楼-- · 2019-05-21 02:28

This is an interesting one...
I think the PHP (server-side) is waiting for a body which contains form data, and within that form data (which BTW was explicitly mentioned to be multiform and not just test) there's binary data of a file.
May I suggest a different root for uploading your files? How about ftp'ing the file, and on the server side having a cron-job that scans the directory to which the file was uploaded, and runs the PHP validation needed, then moving it to the desired location. If you're concerned about the un-synchronized nature of this solution, run this cron every few seconds (assuming the validation code is short and simple).

Hope this helps.

查看更多
登录 后发表回答