PDA

Ver la Versión Completa : Que estoy haciendo mal ?


piolillo
28-11-2007, 00:42:03
Haber en principio muy buenas a todos, tengo una pequeña duda que me carcome por dentro y la cuestión es la siguiente:

Quiero mandar un archivo (Stream) a través de Delphi usando el componente Indi para Delphi 5 que es precisamente la versión que uso, y el problema viene aquí:


procedure TForm1.Button1Click(Sender: TObject);
var
Stream : TIdMultipartFormDataStream;
begin
Stream := TIdMultipartFormDataStream.Create;
try
Stream.AddFile('file','C:\Documents and Settings\Administrador\Escritorio\prueba.txt','multipart/form-data');

IdHTTP1.Post('http://www.piolillosoft.com/bajar/bajar.php',Stream);
finally
Stream.Free;
end;


en la parte tream.AddFile('file',' (File es el nombre del campo del formulario del script en php que se encargara de copiar el nombre del archivo en el servidor.

Aquí la dirección del script en php:

IdHTTP1.Post('http://www.piolillosoft.com/bajar/bajar.php',Stream);

Aquí Donde esta hubicado el fichero en mi disco duro:

Stream.AddFile('file','C:\Documents and Settings\Administrador\Escritorio\prueba.txt','multipart/form-data');

Aquí el enctype de el script en php:
'multipart/form-data'); (Tal y como esta en el script)

Y el script pues en la misma pagina que os he puesto.

Entonces la pregunta es:
Por que no me envía el fichero qu es lo que estoy haciendo mal ?

Haber como explorador predeterminado uso el Firefox y como lenguaje Delphi5 De hecho todo me compila bien incluso al darle al botón de envío no me genera ningún error solo que no me envía nada si alguien me puede ayudar se lo agradeceré de corazón.

Muchas gracias de ante mano. :)

egostar
28-11-2007, 00:50:56
Hola piolillo,

No puedo ayudarte con tu duda, pero si te puedo decir que estas haciendo mal.

No pones un titulo adecuado al hilo

Eso no ayuda a los demás compañeros si es que tienen el mismo problema que tú.

No usas etiquetas para que tu código se vea bien


procedure TForm1.Button1Click(Sender: TObject);
var
Stream : TIdMultipartFormDataStream;
begin
Stream := TIdMultipartFormDataStream.Create;
try
Stream.AddFile('file','C:\Documents and Settings\Administrador\Escritorio\prueba.txt','multipart/form-data');
IdHTTP1.Post('http://www.piolillosoft.com/bajar/bajar.php',Stream);
finally
Stream.Free;
end;
end;


Notas la diferencia ?

Te invito a leer la guia de estilo del foro (http://wiki.clubdelphi.com/wiki/index.php/Guia_de_estilo).

Espera un poco y alguien te podrá auxiliar.

Salud OS

piolillo
28-11-2007, 01:59:26
Vale muchas gracias Egostar y disculpa la poca cotumbre ya de por si es un error mio sorry compañero :(

dec
28-11-2007, 02:31:05
Hola,

Si no me equivoco, algo en tu código está "mal", y es que no indicas el "MIME/Type" del archivo en el método "AddFile"... he revisado un poco la ayuda, y, bueno, viene incluso el siguiente "ejemplo":


uses
IdGlobalProtocols, IdMultipartFormData;

begin
AValues := TIdStringList.Create;

AValues.Values['usr'] := '"John Doe"';
AValues.Values['grp'] := 'public';
AValues.Values['fil'] := 'c:imageslogo.gif';

PostStream:= TIdMultiPartFormDataStream.Create;
ResponseStream := TIdStringStream.Create('');

try
PostStream.AddFormField('usr', AValues.Values['usr']);
PostStream.AddFormField('grp', AValues.Values['grp']);

PostStream.AddFile('fil', AValues.Values['fil'],
GetMIMETypeFromFile(AValues.Values['fil']));

IdHTTP1.Request.ContentType := PostStream.RequestContentType;
IdHTTP1.Post(sURL, PostStream, ResponseStream);
finally
Memo1.Text := ResponseStream.DataString;
ResponseStream.Free;
PostStream.Free;
AValues.Free;
end;



Pero, por más que le he dado vueltas no he conseguido que funcionase. También yo pruebo con un script PHP en el servidor. Pero, ya digo, no he conseguido que funcionase. Creo que algo se me escapa en todo esto...

piolillo
28-11-2007, 10:25:49
Dec Gracias de todas formas eres muy amable. Lo que me irrita de este código es que algo que parece tan sencillo no funcione jeje, parace ser que no solo a ti se te pasa algo por alto a mi también y la cuestión es que este tema debería de estar más que "Mascado" pero claro ya te digo en este tipo de eventos no estoy muy "ducho" espero que lo pueda(y puedas) resolverlo lo antes posible por que ya no es una cosa que solo la necesite si no ya también es algo de cabezonería más orgullo jejeje, en fin haber si nosotros podemos resolver este rompecabezas o algún compañero nos hecha una manilla en descifrar el por que. No es que sea un Expediente "X" pero claro basta con que falle lo más mínimo en este tipos e códigos para que deje de funcionar el invento, no se si será el script, cosa que lo dudo por que desde el webbrowser se hace perfectamente, funciona el php a las mil maravillas pero claro el tema no es ese, no lo quiero hacer desde el navegador ni mucho menos no es esa la idea, por lo tanto haber si nosotros o bien algún compañero gentil se ofrece para darnos una explicación de que es lo que puede estar fallando.

De ante mano muchas gracias "Dec" y a todos los compañeros del club delphi.

Por favor una ayudita help help :(

rolandoj
29-11-2007, 02:21:00
Hola,

Hay dos instrucciones que son obligatorias antes del post y que te hacen falta. Concretamente el PrepareStreamForDispatch y ubicar la Position en 0.

Mira este ejemplo :

Var
TheURL: String;
ResponseStream: TMemoryStream;
MultiPartFormDataStream: TMsMultiPartFormDataStream;
Begin
....
TheURL := 'http://www.piolillosoft.com/bajar/bajar.php';
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
SCWHTTP.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFormField('CODE', ACode);
MultiPartFormDataStream.AddFile('Archivo', AFileName, 'image/jpg');
{ Estas dos deben ir antes del Post }
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
{ Ahora sí envías }
SCWHTTP.Post(TheURL,MultiPartFormDataStream, ResponseStream);
finally
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
End;

piolillo
29-11-2007, 16:36:25
Hola Rolandoj.

En principio muchísimas gracias por la molestia y amabilidad de tomarte tu tiempo para ayudarme con esto, solo un par de cosillas:

Hice lo que me ponías en tu código pero me encuentro los siguientes problemas al intentar compilarlo:

[Error] Unit1.pas[34]: Undeclared identifier: 'TMsMultiPartFormDataStream'
[Error] Unit1.pas[38]: Missing operator or semicolon
[Error] Unit1.pas(41): Missing operator or semicolon
[Error] Unit1.pas(42): Missing operator or semicolon
[Error] Unit1.pas[43]: Missing operator or semicolon
[Error] Unit1.pas[45]: Missing operator or semicolon
[Error] Unit1.pas[46): Missing operator or semicolon
[Error] Unit1.pas[46): Incompatible types: TPosition' and Integer'
[Error] Unit1.pas[48]: There is no overloaded version of 'Post' that can be called with these arguments
[Error] Unitl.pasfSO]: Missing operator or semicolon
[Fatal Error] Project!.dpr(5]: Could not compile used unit 'Unitl.pas'

Despues al revisarlo bien me di cienta de que no estaba tampocoen uses el:
MsMultiPartFormData

Una vez lo puse ya estaba más o menos solucionado esa parte


Bueno también se te paso por alto el declarar como variables tipo string Acode y Afilename que creo que son string verdad ? :cool:

Tambieen me volvi loco para darme cuenta que este nombre:

SCWHTTP.Post( es el nombre que le dabas tu al indy jejeje por que a mi me sale inicialmente como Idhttp :)

Después tengo el siguiente problema me da error de compilación en:

[Fatal Error] Unit1.pas(8]: File not found: 'MsMult.iPartFormData.dcu'

Que componente estas usando hay ? :confused:

Muchas gracias de ante mano y me estas ayudando mucho por favor si eres tan amable haber si soluciono ese poquito que me queda solo decirte que mi script es php uso las indy 9 para delphi 5. Muchísimas gracias de verdad Rolanj y haber si me comentas.

Muchísimas gracias y haber si me dices porfa.

petete2008
28-07-2011, 15:07:01
Que pequeño es el mundo piolillo, jejee. (si eres el piolillo que yo creo que eres que supongo que si).
Me toca programar algo similar a tu duda y se plantea la misma duda de cómo desarrollarlo.
¿Cómo llevas el tema? ¿lo conseguistes al final?
Un Saludo.

petete2008
28-07-2011, 17:23:24
Resuelto. :)

http://www.delphiaccess.com/forum/delphi/subir-un-archivo-via-http-con-idhttp/?action=thankyoupostlist;msg=32131