Загрузить и POST файл на страницу PHP - PullRequest
2 голосов
/ 23 ноября 2010

Мне нужен способ загрузить файл и отправить его на страницу php

php находится на сервере apache

, и я использую этот код c в своем настольном приложении:

Это сокет с кодом c

Когда я запускаю Программу, могу получить

Размер файла 772906, открыть сервер в порядке Размер файла 772906 Подключиться к серверу, в порядке Открыть файл, нормально fread 102400байты, отправка 102400 байт, фред 102400 байт, отправка 102400 байт, фред 102400 байт, отправка 102400 байт, фред 102400 байт, отправка 102400 байт, фред 102400 байт, отправка 102400 байт, фред 102400 байт, отправка 102400 байт, фред 102400 байт, 5610 байт, отправка 10, Отправка 56106 байт Отправка файла завершена!Результат: Код возврата:Загрузить:Тип:Размер: 0 КбВременный файл:Хранится в:

Но файл не существует.

Полагаю, возможно, это возможный протокол HTTP, но я не знаю, как это сделать.

Не могли бы вы рассказать мне подробности?

Большое спасибо.

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

} 

мой php:

<?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 ]

2 голосов
/ 23 ноября 2010

Если вы хотите загрузить файл, вы должны начать с POST /file/to/somewhere.php, а не GET.

Если вы хотите посмотреть протокол, вы можете либо прочитать спецификации HTTP, либо даже лучше, установить wireshark и выполнить загрузку с помощью браузера. Затем вы можете увидеть в Wireshark, какие сообщения отправляются браузером, и просто скопировать их в свою программу.

IIRC протокол должен выглядеть следующим образом:

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>

Я набираю это из своей головы, так что вам действительно стоит посмотреть, как это делает браузер, но это общее представление о том, как работает почта.

0 голосов
/ 23 ноября 2010

Это интересный ...
Я думаю, что PHP (на стороне сервера) ожидает тело, которое содержит данные формы, и внутри этих данных формы (которые, кстати, явно упоминались как мультиформные, а не просто тестовые) есть двоичные данные файла. Могу ли я предложить другой рут для загрузки ваших файлов? Как насчет ftp'инга файла и на стороне сервера, имеющего задание cron, которое сканирует каталог, в который был загружен файл, и запускает необходимую проверку PHP, затем перемещая его в нужное место. Если вас беспокоит несинхронизированная природа этого решения, запускайте этот cron каждые несколько секунд (при условии, что код проверки короткий и простой).

Надеюсь, это поможет.

...