2010-11-23 2 views
2

Мне нужен способ, чтобы загрузить файл и отправить его в PHP страницуЗагрузить и POST файл PHP страницы

РНР на сервер Apache

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

это гнездо на с кодом

Когда я выполняю программу, можно получить

размер файла 772906 открыт сервер нормально 44445164 +10617451515053691368888 Размер файла 772906 Подключение к серверу ок Открыть файл ок Fread 102400 байт, отправка 102400 байт Fread 102400 байт, Отправка 102400 байт Fread 102400 байт, Отправка 102400 байт Fread 102400 байт, Отправка 102400 байт Fread 102400 байты, Отправка 102400 байт fread 102400 байт, отправка 102400 байт fread 102400 байт, отправка 102400 байт fread 56106 байт, отправка 56106 байт Отправка файла Готово! результат: Код возврата:
загрузки:
Тип:
Размер: 0 Kb Файл
Temp:
Хранится в:

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

Возможно, это возможно протокол 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 





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

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

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

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

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

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

Смежные вопросы