Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Automatizar la subida de imagenes a internet (https://www.clubdelphi.com/foros/showthread.php?t=59175)

gulder 15-08-2008 16:23:18

Automatizar la subida de imagenes a internet
 
Hola foro como andan espero que bien bueno les vengo a preguntar si esto se puede:

hay servidores en internet que nos permiten subir imagenes caso especifico ver siguiente enlace,

http://img.tomatone.net/index.php

hasta hay todo bien lo que yo quiero hacer es por medio de un programa delphi automatizar las subidas de varias imagenes a este servidor y guardar la direccion de la misma, osea la direccion donde se guardo la imegen en el servidor espero que me hallan entiendido saludos gulder

roman 16-08-2008 01:45:05

Para ese caso específico:

Código Delphi [-]
uses IdHTTP, IdMultipartFormData;

{
  Sube una imagen al sitio http://img.tomatone.net/
  Devuelve la URL de la imagen o una cadena vacía en caso de error

  El sitio sólo acepta imágenes png, jpeg y gif
}
function UploadImage(FileName: String): String;
var
  IdHTTP: TIdHTTP;
  Stream: TIdMultipartFormDataStream;
  Ext: String;
  Response: String;
  I: Integer;

begin
  Result := '';

  Ext := Copy(ExtractFileExt(FileName), 2, MaxInt);
  if (Ext = 'jpg') then
    Ext := 'jpeg';

  IdHTTP := TIdHTTP.Create;
  Stream := TIdMultipartFormDataStream.Create;

  try
    Stream.AddFile('userfile', FileName, 'image/' + Ext);
    Stream.AddFormField('comp', 'ok');
    Response := IdHTTP.Post('http://img.tomatone.net/index.php', Stream);

    I := Pos('href=''big/', Response);
    if I > 0 then
    begin
      Delete(Response, 1, I + 9);
      I := Pos('''', Response);
      if I > 0 then
      begin
        Result := 'http://img.tomatone.net/big/' + Copy(Response, 1, I - 1);
      end;
    end;
  finally
    IdHTTP.Free;
    Stream.Free;
  end;
end;

// Saludos

seoane 16-08-2008 02:41:58

Rapido y eficaz, todo un alarde roman :)

gulder 16-08-2008 04:31:39

señores foristas disculpen por haberme perdido, me quede dormido y gracias roman eres grande no lo he probado pero enseguida lo voy hacer saludos

gulder 16-08-2008 06:09:48

1 Archivos Adjunto(s)
bueno roman probe tu ejemplo lo que me dices y no me funcionoo aqui abjunto le que ice con tu ejemplo pero al final no pude ver la url de la imagen y no se si la imagen subio bueno espero que me ayudes a aclarar por que no funciona saludos gulder

roman 16-08-2008 16:26:47

Pues realmente no sé qué pueda pasar. Tal como lo puse, lo probé varias veces y con los tres formatos posibles, y en todos los casos me funcionó. Tendrías que fijarte con detalle en el texto que te devuelve IdHTTP.Post para ver qué error te marca.

El sitio en cuestión es sumamente simple y no renombra los archivos, de manera que te marca un error (ya también lo probé) si intentas subir un archivo con el mismo nombre que otro que ya exista.

// Saludos

roman 16-08-2008 16:28:07

Cita:

Empezado por seoane (Mensaje 307921)
Rapido y eficaz, todo un alarde roman :)

Hey, pensé que ibas a poner la solución usando wininet :)

// Saludos

gulder 16-08-2008 16:38:29

bueno roman gracias seguire viendo para ver cual es el problema saludos

seoane 17-08-2008 00:37:09

Cita:

Empezado por roman (Mensaje 307962)
Hey, pensé que ibas a poner la solución usando wininet :)

Si es que entro al trapo enseguida :D

Aquí tienes el código roman, pero aviso que esta bastante sucio y tiene algo de copy&paste de otros proyectos, pero aquí es la una de la madrugada (mas bien una y media) y no voy a dedicarle mas tiempo :D

Código Delphi [-]
uses
  WinInet;

const
  strSeparador = 'Separador528C65E88C1F4DB5BDB11BF1558AF1C3';

function UploadImage(Filename: String): String;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hReq: HINTERNET;
  Context: DWORD;
  BytesRead: DWORD;
  Data: TMemoryStream;
  Response: TStringStream;
  Buffer: PChar;
  Str: String;
  FileStream: TFileStream;
  i: Integer;
begin
  Result:= EmptyStr;
  Context:= 0;
  hNet := InternetOpen('Agente', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,'img.tomatone.net',80,nil,nil,
      INTERNET_SERVICE_HTTP,0,Context);
    if (hCon <> nil) then
    begin
      hReq:= HttpOpenRequest(hCon,'POST','/index.php',nil,nil,nil,
          INTERNET_FLAG_RELOAD,Context);
      if (hReq <> nil) then
      begin
        Data:= TMemoryStream.Create;
        try
          // Agregamos el campo
          Str:= '--' + strSeparador + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          Str:= 'Content-Disposition: form-data; name="comp"'
          + #13#10#13#10 + 'ok' + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          // Agregamos el archivo
          Str:= '--' + strSeparador + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          Str:= 'Content-Disposition: file; name="userfile"; filename="' + ExtractFilename(Filename) + '"' + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          Str:= 'Content-Type: image/jpeg' + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          Str:= 'Content-Transfer-Encoding: binary' + #13#10#13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          FileStream:= TFileStream.Create(Filename,fmOpenRead);
          try
            Data.CopyFrom(FileStream,0)
          finally
            FileStream.Free;
          end;
          Str:= #13#10 + '--' + strSeparador + '--' + #13#10;
          Data.WriteBuffer(PChar(Str)^,Length(Str));
          if HttpSendRequest(hReq,
            PChar('Content-Type: multipart/form-data; boundary='
            + strSeparador), Cardinal(-1), Data.Memory,Data.Size) then
          begin
            Response:= TStringStream.Create(EmptyStr);
            try
              GetMem(Buffer,32*1024);
              try
                while (InternetReadFile(hReq,Buffer,32*1024,BytesRead)) do
                begin
                  if (BytesRead = 0) then
                    break;
                  Response.Write(Buffer^,BytesRead)
                end; 
                Str:= Response.DataString;
                // Esto se lo copio a roman
                I := Pos('href=''big/', Str);
                if I > 0 then
                begin
                  Delete(Str, 1, I + 9);
                  I := Pos('''', Str);
                  if I > 0 then
                  begin
                    Result := 'http://img.tomatone.net/big/' + Copy(Str, 1, I - 1);
                  end;
                end;
                // Fin del plagio
              finally
                FreeMem(Buffer);
              end;
            finally
              Response.Free;
            end;
          end;
        finally
          Data.Free;
        end;
        InternetCloseHandle(hReq);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;

roman 19-08-2008 16:12:00

gulder, retomando esto, ojalá te sirva la solución de seoane. Debo comentar que la mia la probé y funciona bien con Indy 10, pero al probarla en casa con Indy 9 no funciona y el sitio en cuestión no manda ningún mensaje aclaratorio. Tengo la impresión de que no está mandando correctamente el archivo, pero no he tenido oportunidad de profundizar.

¿Cuál versión estás usando tú?

// Saludos

gulder 20-08-2008 00:04:01

hola a todos como andan disculpen enormemente por abandonar este pots siendo yo el que mas le interesaba pero fue por causa de fuerza mayor, siguiendo por donde iba Román no me funciona por que yo uso las indy 9 entonces por eso no me funcionaba lo que tu expones.
Y seocene en estos momentos estoy probando lo que me dices saludos y gracias a los dos por no desmotivarse

gulder 20-08-2008 00:37:13

hola foro seoane funciona a la perfeccion gracias


La franja horaria es GMT +2. Ahora son las 21:33:26.

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