Carga y archivo POST a la página PHP

Necesito una forma de cargar un archivo y PUBLICARLO en la página php

el php está en el servidor apache

y uso este código c en mi aplicación de escritorio:

Es un socket por código c

Cuando ejecuto el progtwig, puedo obtener

El tamaño del archivo es 772906 servidor abierto ok El tamaño del archivo es 772906 Conectar al servidor ok Abrir archivo ok fread 102400 bytes, enviar 102400 bytes fread 102400 bytes, enviar 102400 bytes fread 102400 bytes, enviar 102400 bytes fread 102400 bytes, enviar 102400 bytes fread 102400 bytes, enviando 102400 bytes fread 102400 bytes, enviando 102400 bytes fread 102400 bytes, enviando 102400 bytes fread 56106 bytes, enviando 56106 bytes enviando archivo ¡Terminado! resultado: código de retorno:
Subir:
Tipo:
Tamaño: 0 Kb
Archivo temporal:
Guardado en:

Pero el archivo no existe.

Supongo que tal vez sea posible el protocolo HTTP, pero no sé cómo hacerlo.

¿Me dirías detalles?

Muchas gracias.

#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; } 

mi php es:

  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"; } ?>

Si desea cargar un archivo, debe comenzar con POST /file/to/somewhere.php no GET.

Si desea ver el protocolo, puede leer las especificaciones de HTTP o incluso mejor, instalar wireshark y realizar la carga con un navegador. Luego puede ver en wireshark qué mensajes envía el navegador y simplemente replicarlos con su progtwig.

IIRC el protocolo debería verse así:

 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  

Estoy escribiendo esto de mi cabeza, así que deberías ver al navegador hacerlo, pero esa es la idea general de cómo funciona la publicación.

Este es uno interesante…
Creo que el PHP (lado del servidor) está esperando un cuerpo que contenga datos de formulario, y dentro de ese formulario los datos (que por cierto se mencionó explícitamente que son multiformes y no solo de prueba) hay datos binarios de un archivo.
¿Puedo sugerir una raíz diferente para cargar sus archivos? ¿Qué hay de ftp’ing el archivo, y en el lado del servidor tener un cron-job que escanea el directorio al que se cargó el archivo, y ejecuta la validación de PHP necesaria, y luego moverlo a la ubicación deseada. Si le preocupa la naturaleza no sincronizada de esta solución, ejecute este cron cada pocos segundos (suponiendo que el código de validación sea breve y simple).

Espero que esto ayude.