I need a way to upload a file and POST it into php page
the php is on apache server
and i use this c code in my desktop application:
It's a socket by c code
When I execute the Program , can get
The file size is 772906
open server ok
The file size is 772906
Connect to server ok
Open file ok
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 102400 bytes, Sending 102400 bytes
fread 56106 bytes, Sending 56106 bytes
Sending file Finished!
result: Return Code:
Upload:
Type:
Size: 0 Kb
Temp file:
Stored in:
But file is not exist .
I guess maybe it's possible HTTP protocol ,But I don't know how to do.
would you tell me details ?
Thanks a lot.
#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;
}
my php is :
<?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";
}
?>
If you want to upload a file you should begin with POST /file/to/somewhere.php not GET.
If you want to see the protocol, you could either read up on HTTP specs or even better, install wireshark and do the upload with a browser. Then you can see in wireshark which messages are sent by the browser and just replicate these with your program.
IIRC the protocol should look like this:
I'm typing this from my head so you really should watch the browser do it, but that's the general idea of how post works.
This is an interesting one...
I think the PHP (server-side) is waiting for a body which contains form data, and within that form data (which BTW was explicitly mentioned to be multiform and not just test) there's binary data of a file.
May I suggest a different root for uploading your files? How about ftp'ing the file, and on the server side having a cron-job that scans the directory to which the file was uploaded, and runs the PHP validation needed, then moving it to the desired location. If you're concerned about the un-synchronized nature of this solution, run this cron every few seconds (assuming the validation code is short and simple).
Hope this helps.