Autor
|
Tema: Ayuda envío archivo a web con C vía http (Leído 26,313 veces)
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Y para subirlo lo guardo todo el archivo en una cadena y hago el POST si es que es viable, o como es eso de abrir el archivo en stream?, soy muy pesado lo se xD.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
abrirlo con fstream en caso de C++, o un FILE en C. O bueno, como quieras abrir el archivo xD El caso es que lo que leas, lo enviés por el socket.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Supongo que esto debería funcionar: archivo=fopen("archivito.txt","rt"); while (fgets(cod, 100, archivo) != NULL) { strcpy(ced,""); strcat(ced,"nombre=archivo&contenido="); strcat(ced,cod); len=strlen(ced); itoa(len,cad,10); strcpy(buffer,"POST /script.php HTTP/1.0\r\n"); strcat(buffer,"Host: mipagina.com\r\n"); strcat(buffer,"Content-type: application/x-www-form-urlencoded\r\n"); strcat(buffer,"Content-length: "); strcat(buffer,cad); strcat(buffer,"\r\n\r\n"); strcat(buffer,ced); printf("%s\n",buffer); if(connect(sock,(struct sockaddr*)&direccion,sizeof(direccion))==-1) { printf("\nError al conectar.\n"); exit(0); } printf("\nConectado correctamente.\n");
if((send(sock,buffer,strlen(buffer),0))==-1) { printf("Error Send.\n"); exit(0); } } Que vaya enviando POST con el contenido del archivo hasta que se acabe, aunque no se como funciona pues no me va a mi el programa, lo que le falta es control de errores, puede que falle un POST en algún momento, y no se tiene en cuenta, por lo demás bien.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Solo tienes que mandar 1 post. Primero la cabecera entera, y luego lees el archivo
|
|
« Última modificación: 30 Julio 2014, 13:38 pm por Eternal Idol »
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
XD te refieres en guardar el archivo entero en una cadena y enviarla como variable al servidor? Si el archivo es grande funcionará?, si es así perfecto
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Yo lo primero que hago, es leer el tamaño del archivo. Entonces, enviar la cabecera con el content-length calibrado. Y luego, lees el archivo, y lo que lees lo envías. No hace falta guardarlo.
|
|
|
En línea
|
|
|
|
daryo
|
mejor codificalo en base64 asi no tendras caracteres raros y en el servidor con php lo decodificas
|
|
|
En línea
|
buenas
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
No hace falta codificar. Dado que es un archivo, los datos y los "caracteres raros" pasan sin problema.
|
|
|
En línea
|
|
|
|
Kaxperday
Desconectado
Mensajes: 702
The man in the Middle
|
Curioso, entonces como propones enviar el archivo a la vez que lo lees sin guardar lo que lees en variables. Es decir yo solo se subir variables con POST, para subir un archivo tendría que subir o una variable cargadísima con todo su contenido, o bien varias con poco contenido, pero haciendo varios POST, es eso correcto? Si a lo que te referias no es a ninguna de las 2 anteriores me gustaría conocer tu idea.
|
|
|
En línea
|
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Casualmente acabo de termianr un servidor HTTP en C++. Y eso es justo lo que hago jaja Para evitar tener una variable de 5 megas, o de 1 giga incluso, hago esto: char arr[1024]; ifstream f("...",ios::binary); while(!f.eof()){ f.read(arr,1024); if(f.eof()) serv.send(0,string(arr,f.gcount())); else serv.send(0,string(arr,1024)); }
Está en C++. serv.send() es para enviarle a un cliente de mi servidor la string. f.gcount() devuelve la cantidad de bytes leídos (en caso de no haber leído el tamaño del array (1024) ) Donde yo pongo serv.send(), tú pondrías send(socket,... ...). Es eso, no más. Un dato importante: Si envías muchos datos rápidamente, send() puede devolver error WSAWOULDBLOCK. Por lo tanto, te aconsejo que coloques el socket como blocking antes de enviar. Para ello, un snippet: void setBlocking(SOCKET sock, bool blocking){ u_long block = blocking ? 0 : 1; ioctlsocket(sock, FIONBIO, &block); }
Ese es un método de "partir" e ir enviando el archivo mientras lo lees. Bueno, creo que eso es todo.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Messenger.UIAutomation ¿Como envio un archivo?
Scripting
|
markus_bitman
|
3
|
3,344
|
2 Febrero 2010, 08:58 am
por Tyrz
|
|
|
[C] Envió de archivo binario por HTTP
Programación C/C++
|
yeikos
|
6
|
4,399
|
4 Mayo 2010, 23:45 pm
por yeikos
|
|
|
¿Como genero un archivo con un nombre por defecto y lo envió por ftp?
Scripting
|
sabeeee
|
3
|
2,742
|
4 Febrero 2011, 19:35 pm
por Edu
|
|
|
Como automatizar el envio de cabeceras HTTP ???
« 1 2 »
Desarrollo Web
|
cybero
|
10
|
6,471
|
28 Abril 2012, 18:16 pm
por _teiki
|
|
|
Envio de archivo sin nombre Telegram C#
.NET (C#, VB.NET, ASP)
|
rigorvzla
|
2
|
3,623
|
27 Junio 2018, 04:29 am
por rigorvzla
|
|