2010-11-23 11 views
2

나는 파일을 업로드 및 PHP 페이지에 게시하는 방법이 필요업로드 및 POST 파일

PHP는 아파치 서버

에 있고 난 내 데스크톱 응용 프로그램이 C 코드를 사용

그것은 내가 프로그램을 실행하면

이 얻을 수있는 C 코드에 의한 소켓의

파일 크기는 772,906 공개 서버 확인입니다파일 크기는 가 102,400을 FREAD 102,400 바이트 보내기 102,400 바이트 FREAD 102,400 바이트 보내기 102,400 바이트 FREAD 102,400 바이트 보내기 102,400 바이트 FREAD 102,400 바이트를, 전송, 서버 확인 파일 열기 확인 FREAD 102,400 바이트 772,906 연결입니다 바이트, 송신 102400 바이트 fread 102400 바이트, 송신 102400 바이트 fread 102400 바이트, 송신 102400 바이트 fread 56106 바이트, 송신 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

당신이하지 /file/to/somewhere.php POST로 시작해야합니다 파일을 업로드합니다.

프로토콜을 보려면 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

이것은 흥미로운 것입니다 ...
PHP (서버 측)는 양식 데이터가 들어있는 몸체를 기다리고 있으며 해당 양식 데이터 내에서 (BTW는 명시 적으로 다중 형식이어야하며 테스트) 파일의 바이너리 데이터가 있습니다.
파일을 업로드 할 때 다른 루트를 제안 할 수 있습니까? 파일을 ftp'ing하는 방법과 파일이 업로드 된 디렉토리를 스캔하는 cron-job이있는 서버 측에서 PHP 유효성 검사를 실행 한 다음 원하는 위치로 이동하는 방법은 어떻습니까? 이 솔루션의 동기화되지 않은 특성이 염려되는 경우 몇 초마다이 cron을 실행하십시오 (유효성 검사 코드가 짧고 간단하다고 가정).

희망이 도움이됩니다.