上传和POST文件到PHP页面

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

php在apache服务器上

我在我的桌面应用程序中使用此c代码:

它是c代码的套接字

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

文件大小是772906 open server ok文件大小是772906连接到服务器ok打开文件ok fread 102400 bytes,发送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  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  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是:

  0){ echo "Return Code: " . $_FILES["file"]["error"] . "
"; }else{ echo "Return Code: " . $_FILES["file"]["error"] . "
"; echo "Upload: " . $_FILES["file"]["name"] . "
"; echo "Type: " . $_FILES["file"]["type"] . "
"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
"; //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"; } ?>

如果要上传文件,则应以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  

我正在从头脑中输入这个,所以你真的应该看看浏览器这样做,但这是关于邮政如何工作的一般想法。

这是一个有趣的…
我认为PHP(服务器端)正在等待包含表单数据的主体,并且在该表单数据中(明确提到BTW是多forms而不仅仅是测试)存在文件的二进制数据。
我可以建议使用不同的根来上传您的文件吗? 如何ftp’ing文件,并在服务器端有一个cron-job扫描文件上传到的目录,并运行所需的PHPvalidation,然后将其移动到所需的位置。 如果您担心此解决方案的非同步性质,请每隔几秒运行一次这个cron(假设validation代码简短而简单)。

希望这可以帮助。