【问题标题】:Upload and POST file to PHP page上传和 POST 文件到 PHP 页面
【发布时间】:2010-11-23 17:06:34
【问题描述】:

我需要一种上传文件并将其发布到 php 页面的方法

php 在 apache 服务器上

我在我的桌面应用程序中使用了这个 c 代码:

这是一个c代码的socket

当我执行程序时,可以得到

文件大小为 772906 打开服务器正常 文件大小为 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
临时文件:
存储在:

但是文件不存在。

我猜可能是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"; 

} 

?>

【问题讨论】:

    标签: php c sockets file-upload


    【解决方案1】:

    如果你想上传一个文件,你应该以 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>
    

    我是在脑海中输入这个,所以你真的应该看浏览器这样做,但这是帖子如何工作的一般想法。

    【讨论】:

      【解决方案2】:

      这是一个有趣的...
      我认为 PHP(服务器端)正在等待一个包含表单数据的主体,并且在该表单数据中(顺便说一句,它被明确提到是多格式的,而不仅仅是测试)有一个文件的二进制数据。
      我可以建议一个不同的根来上传你的文件吗? ftp 文件怎么样,在服务器端有一个 cron-job 扫描文件上传到的目录,并运行所需的 PHP 验证,然后将其移动到所需的位置。如果您担心此解决方案的不同步性质,请每隔几秒运行一次此 cron(假设验证代码简短而简单)。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2010-11-21
        • 2023-01-12
        • 2015-07-03
        • 2011-11-03
        • 2017-08-07
        • 2021-08-28
        • 2015-05-06
        • 1970-01-01
        • 2014-01-22
        相关资源
        最近更新 更多