Foros del Web » Administración de Sistemas » Software para Servers »

Error con File Upload en CGI hecho en C++

Estas en el tema de Error con File Upload en CGI hecho en C++ en el foro de Software para Servers en Foros del Web. Hola, ¿Como están?. Tengo que realizar una subida de archivos usando un input tipo file en HTML. Esos datos del formulario viajan a un CGI ...
  #1 (permalink)  
Antiguo 10/03/2014, 19:51
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 11 años
Puntos: 8
Error con File Upload en CGI hecho en C++

Hola, ¿Como están?. Tengo que realizar una subida de archivos usando un input tipo file en HTML. Esos datos del formulario viajan a un CGI hecho en C++. Pero resulta que al ir recibiendo el archivo, descubro que viene mezclado con algo parecido a una cabecera HTTP. ¿Será que alguien sabe como hacer para recibir solo el archivo e ignorar las cabeceras HTTP??

Para demostrar que si estoy trabajando en mi problema, les muestro el codigo fuente. Gracias de antemano.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.  
  12.     ///Esto me funciona. Por lo menos puedo contar cuantos bytes mide el archivo aproximadamente.
  13.     int content_length = atol(getenv("CONTENT_LENGTH"));
  14.     char *content = new char[content_length];
  15.  
  16.     ///Abro un stream para escribir el archivo a subir.
  17.     ofstream archivo;
  18.     archivo.open("D:\\Archivos de Programa\\Apache Software Foundation\\Apache2.2\\uploads\\archivo_subido.txt");
  19.  
  20.     cout << "Content-type:text/html\r\n\r\n";
  21.     cout << "<html><head><title>Page</title></head>";
  22.     cout << "<body><h1>Content lenght: ";
  23.     cout << content_length << "</h1>";
  24.  
  25.     ///He oido que los archivos enviados por HTML se recibe por la entrada estandar
  26.     ///Asi que lo recibo lo copio a un buffer
  27.     cin.read(content, content_length);
  28.  
  29.     cout << "<h1>Content</h1>";
  30.     cout << "<b>" << content << "</b>";
  31.  
  32.     ///El contenido del archivo lo grab� en disco.
  33.     archivo << content;
  34.  
  35.     /*cout << content;*/
  36.  
  37.     cout << "<br><br>" << content;
  38.     cout << "</h1>";
  39.     cout << "</body></html>";
  40.  
  41.     archivo.close();
  42.  
  43.     delete [] content;
  44.  
  45.     return 0;
  46. }



Espero que al menos me den una orientacion. Gracias de antemano.
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.

Última edición por jhonny6721; 10/03/2014 a las 19:53 Razón: Me falto un pequeño dato.
  #2 (permalink)  
Antiguo 11/03/2014, 09:08
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 6 meses
Puntos: 127
Respuesta: Error con File Upload en CGI hecho en C++

trata de revisar las lineas de cabecera y ve si las puedes borrar
me parece que siempre hay algo antes del archivo espesifico, como una etiqueta
podrias buscarla y borrar lo que se encuentre antes, asi escribes el archivo sin problema

podrias subir un txt y mostrar el resultado asi seria mejor y mas rrapida la ayuda
  #3 (permalink)  
Antiguo 11/03/2014, 22:25
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 11 años
Puntos: 8
Respuesta: Error con File Upload en CGI hecho en C++

Gracias por tu ayuda. Trataré de buscar algun patron para encontrar en donde comienza el archivo. Para muestra, publico lo que obtengo:

Código C++:
Ver original
  1. ------WebKitFormBoundaryzXsf6MVFOz22BXzl
  2. Content-Disposition: form-data; name="file"; filename="prueba.txt"
  3. Content-Type: text/plain
  4.  
  5. Este es el fichero que he subido al servidor. Esto es una prueba. 1234 1234. Probando configuracion.
  6.  
  7. Entendiendo caracteres...Leyendo algo...
  8. ------WebKitFormBoundaryzXsf6MVFOz22BXzl
  9. Content-Disposition: form-data; name="submit"
  10.  
  11. Enviar
  12. ------WebKitFormBoundaryzXsf6MVFOz22BXzl--

El archivo que he mostrado es uno de texto. Ya lo he intentado con otros tipos como binarios sigue igual. La cabecera se mezcla al principio, y tambien pareciera haber una al final.
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.
  #4 (permalink)  
Antiguo 12/03/2014, 06:50
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 16 años, 6 meses
Puntos: 127
Respuesta: Error con File Upload en CGI hecho en C++

Pues con eso estas listo
todo archivo tendra
cabecera: ------WebKitFormetc,etc,etc,
luego una cabecera de dispocision: Content-Disposition: form-data; name="file"; filename="prueba.txt"
y al final el tipo de archivo enviado Content-Type: text/plain

tendrias que revisar y extraer todo con expreciones regulares, de alli tienes una cabecera de inicio buscando una dispocision con el texto "filename" este dato lo llevan todo los upload, por ser carga de achivos. si envias mas de un archivo trendras multiples cabeceras con dispocisiones filename
asi podras extraer cualquier archivo de cualquier tipo.
  #5 (permalink)  
Antiguo 12/03/2014, 12:01
 
Fecha de Ingreso: diciembre-2013
Mensajes: 150
Antigüedad: 11 años
Puntos: 8
Respuesta: Error con File Upload en CGI hecho en C++

Gracias por tu ayuda, enlinea777. Entonces solo sería cuestion de buscar un patron que indique el comienzo y el final ¿O no? Al menos eso fue lo que entendí.

Bueno, marcare el tema como solucionado, gracias por ayudar
__________________
¿Necesitas ayuda con algún algoritmo? Si tienes dudas, entonces visita: http://algoritmosypseudocodigo.blogspot.com/.

Etiquetas: apache, cgi, file, hecho, ip, servidores-web, upload
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:40.