Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   cómo enviar un fichero a una dirección https (https://www.clubdelphi.com/foros/showthread.php?t=8890)

tetemusic 05-04-2004 14:46:48

necesito ayuda sobre cómo enviar un fichero a una dirección https
 
Qué tal, tengo un problemilla ... Necesito enviar un fichero desde la aplicación que estoy desarrollando en Delphi 6 a una página https, pero no sé qué objeto puedo utilizar, ni cómo ...

Los datos de la página https destino de que dispongo son:

ENCTYPE=multipart/form-data
METHOD=POST
INPUT NAME=registro
TYPE=file
ACCEPT=text/plain

,asímismo también dispongo del UserName y el Password necesarios para conectar con la citada página https. He estado probando el objeto TIEHTTP, que me lo bajé de http://www.badfan.com/delphi/tie_http_https.html , pero no he conseguido que se envíe el fichero ... parece ser que se envía en una variable el contenido del fichero, pero sin su nombre, y en otra variable el nombre del fichero, luego en la página se compone el fichero, pero en mi caso no tengo acceso al código de la página destino https, con lo cual esta forma de envío no me sirve ...

Supongo que habrá algun componente del Delphi 6 con el que pueda realizar el envío del fichero, pero la verdad es que estoy bastante perdido (no tengo conocimientos sobre sockets, etc ...). Si podéis escribirme las líneas de código necesarias, o un resumen de las más importantes os estaría MUUUUY AGRADECIDO.

Muchas Gracias de antemano por vuestra ayuda, tetemusic.

tetemusic 22-04-2004 14:24:40

Problema solucionado!
 
Con el objeto idHTTP he conseguido hacerlo. Aqui os pongo el código, por si os es útil:

Código:

const
CRLF = #13#10;
var
NomFitxer, path, codi, password: string;
Config: TInifile;
aStream: TMemoryStream;
Params: TMemoryStream;
S, linea: String;
F: TextFile;
begin
//enviamos fichero, sus datos y el user y password están en un .ini
path := ExtractFilePath(Application.ExeName);
Config := TIniFile.Create(path+'config.ini');
with Config do
begin
if ReadString('General','Path','Main') <> 'Main' then
path := ReadString('General','Path','Main');
if ReadString('General','Codi','Main') <> 'Main' then
codi := ReadString('General','Codi','Main');
if ReadString('General','Password','Main') <> 'Main' then
password := ReadString('General','Password','Main');
Free;
end;
OpenDialog1.InitialDir := path;
if OpenDialog1.Execute then
NomFitxer := OpenDialog1.FileName;
if NomFitxer <> '' then
begin
aStream := TMemoryStream.create;
Params := TMemoryStream.Create;
idHTTP1.Request.ContentType := 'multipart/form-data;boundary=-----------------------------7cf87224d2020a';
IdHTTP1.Request.Username := codi;
IdHTTP1.Request.Password := password;
try
S := '-----------------------------7cf87224d2020a' + CRLF + 'Content-Disposition: form-data; name="registro"; filename="'+RightStr(NomFitxer,14)+'"' + //registro es el nombre del campo del formulario html
CRLF + 'Content-Type: text/plain' + CRLF + CRLF;
Params.Write(S[1], Length(S));
//copiamos contenido del fichero al memory stream "params"
AssignFile(F,NomFitxer);
Append(F);
Reset(F);
while not EOF(F) do
begin
readln(F, linea);
if not EOF(F) then
linea := linea + CRLF;
Params.Write(linea[1],Length(linea));
end;
CloseFile(F);
S := CRLF +
'-----------------------------7cf87224d2020a';
Params.Write(S[1], Length(S));
try
idHTTP1.Post('https:// ... --aqui va a web--', Params,aStream);
except
on E: Exception do
showmessage('Error encountered during POST: ' + E.Message);
end;
aStream.SaveToFile(path+'\result.htm');
aStream.WriteBuffer(#0' ', 1);
showmessage(PChar(aStream.Memory));
except
end;
end;
end;


marcoszorrilla 22-04-2004 15:52:16

Bueno pues muchas gracias por publicar la solución a la que has llegado.
Si quieres puedes editar tu mensaje y colocar las etiquetas code para que así la presentación sea mejor, es decir delante de donde empieza el código:

'['code']'
y despues de la última instrucción:
'['/code']'

Las comillas simples no se ponen es para que veas el formato.

Código:

ShowMessage('Un Saludo.');

tetemusic 22-04-2004 16:06:38

Mensaje recibido
 
Ciertamente se ve mucho más claro el código de esta manera. Espero que le sirva de ayuda a alguien. Saludos marcoszorrilla, y gracias por tu comentario!

jachguate 22-04-2004 18:13:22

Dado que el código puede ser de utilidad, me he tomado la libertad de indentarlo y publicarlo en este mensaje, ya que en el original del amigo tetemusic, al menos yo, no lo encontré indentado.

Aclaro que no he revisado su contenido ni la lógica... eso ya quedará para quien quiera aprovecharlo. :)

Hasta luego.

;)

Código:

const
  CRLF = #13#10;
var
  NomFitxer, path, codi, password: string;
  Config: TInifile;
  aStream: TMemoryStream;
  Params: TMemoryStream;
  S, linea: String;
  F: TextFile;
begin
  //enviamos fichero, sus datos y el user y password están en un .ini
  path := ExtractFilePath(Application.ExeName);
  Config := TIniFile.Create(path+'config.ini');
  with Config do
  begin
    if ReadString('General','Path','Main') <> 'Main' then
      path := ReadString('General','Path','Main');
    if ReadString('General','Codi','Main') <> 'Main' then
      codi := ReadString('General','Codi','Main');
    if ReadString('General','Password','Main') <> 'Main' then
      password := ReadString('General','Password','Main');
    Free;
  end;
  OpenDialog1.InitialDir := path;
  if OpenDialog1.Execute then
    NomFitxer := OpenDialog1.FileName;
  if NomFitxer <> '' then
  begin
    aStream := TMemoryStream.create;
    Params := TMemoryStream.Create;
    idHTTP1.Request.ContentType := 'multipart/form-data;boundary=-----------------------------7cf87224d2020a';
    IdHTTP1.Request.Username := codi;
    IdHTTP1.Request.Password := password;
    try
      S := '-----------------------------7cf87224d2020a' + CRLF +
            'Content-Disposition: form-data; name="registro";          filename="'+
            RightStr(NomFitxer,14)+'"' + //registro es el nombre del campo del formulario html
            CRLF + 'Content-Type: text/plain' + CRLF + CRLF;
      Params.Write(S[1], Length(S));
      //copiamos contenido del fichero al memory stream "params"
      AssignFile(F,NomFitxer);
      Append(F);
      Reset(F);
      while not EOF(F) do
      begin
        readln(F, linea);
        if not EOF(F) then
          linea := linea + CRLF;
        Params.Write(linea[1],Length(linea));
      end;
      CloseFile(F);
      S := CRLF +
          '-----------------------------7cf87224d2020a';
      Params.Write(S[1], Length(S));
      try
        idHTTP1.Post('https:// ... --aqui va a web--', Params,aStream);
      except
        on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
      end;
      aStream.SaveToFile(path+'\result.htm');
      aStream.WriteBuffer(#0' ', 1);
      showmessage(PChar(aStream.Memory));
    except
    end;
  end;
end;


Henryoh 05-03-2007 22:21:49

Misma problematica
 
Hola, tengo una pregunta, yo tengo la misma necesidad de enviar archivos a una direccion https, solo que en mi caso debo enviar primero, la clave clave=xxxxx y despues debo enviar varios archivos, cada uno con un atributo especifico, es decir el primer archivo se refiere a cuentas por cobrar y debe enviar 'cuentasporcobrar='+ archivo.txt y por ultimo una cifra de control que es un hexadecimal de 32 posiciones, tambien con su atributo.

Mi pregunta es, ¿este componente idHTTP puede hacer el envio de varios archivos a la vez y puede mezclar datos simples como una clave y archivos de no mas de 50 k ?

De antemano gracias por la atencion.


La franja horaria es GMT +2. Ahora son las 23:11:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi