Analitcs

Pesquisar no conteúdo do blog.atlabs.com.br

sábado, 2 de junho de 2012

DELPHI - Upload via Web Server Application - DELPHI

Reações: 


//ATLabs - Postado no site Planetadelphi.com.br - Quase 20.000 views

{
ATENÇÃO: POR MOTIVOS ÓBVIOS, SEMPRE TENTE UTILIZAR A VERSÃO MAIS ATUAL DO DELPHI PARA COMPILAÇÕES WEB, VOCÊ PODERÁ TER PROBLEMAS DE INCOMPATIBILIDADE COM O SERVIDOR DO IIS OU APACHE
// ULTIMO TESTE REALIZADO EM PLATAFORMA DELPHI XE
E LÁ VAMOS NÓS DE NOVO.
FIQUEI 4 DIAS PARA DESCOBRIR COMO FUNCIONA, E COMO O JÁ POSTADO
NOS MEUS OUTROS POSTS NÃO ENCONTREI NADA NA INTERNET DAI EU ME VIREI...
VOU INDICAR COMO SE FAZ UPLOAD DE ARQUIVO VIA WEB SERVER APPLICATION, TESTEI OS FONTES VIA ISAPI (*.DLL) E VIA CGI STAND-ALONE (*.EXE) E FUNCIONOU PERFEITAMENTE.
VAMOS DO COMEÇO, LEMBRANDO QUE EU NÃO VOU DAR DICAS DE HTML, VOU POSTAR SOMENTE O QUE PRECISA PARA QUE FUNCIONE, E
LEMBRANDO SEMPRE QUE EU POSTO O QUE JÁ ESTÁ EM PRATICA NOS MEUS FONTES, POR ESTE MOTIVO ELES FUNCIONAM:
O FORMULÁRIO DO HTML DEVE CONTER A SEGUINTE SINTAXE:
//    form enctype="multipart/form-data" method="post" runat="server" action="../appweb.exe/sobe_arq" name="f_envio">
REPARE NA OPÇÃO [enctype="multipart/form-data"] SE NÃO FOR DECLARADA NÃO FUNCIONA!!!!
SEGUE ABAIXO AS FUNCÕES PARA RESGATAR OS VALORES DO UPLOAD:
EXPLICAÇÃO:
// RETORNA OS VALORES DE CAMPOS DOS FORMULARIOS, DO TIPO TEXTFIELD POR EXEMPLO
function ValorCampoMultipartFormData(const Content: String; Chave,
  NomeCampo: String): String;
// RETORNA O VALOR DO NOME DO ARQUIVO ENVIADO PELO USUARIO FINAL, ELA NÃO RETORNA O CAMINHO, SOMENTE O VALOR
function NomeOriginalArqMultipartFormData(const Content: String; Chave: String): String;
// RETORNA O ARQUIVO EM UMA STRNG GIGANTESCA, SE FOR O CASO DE ARQUIVO ZIP POR EX.
function ValorArquivoMultipartFormData(const Content: String; Chave, TipoArquivo: String): String;
}

function ValorCampoMultipartFormData(const Content: String; Chave,
  NomeCampo: String): String;
Var
 S : String;
begin
// NO HTML INFORMAR:  form enctype="multipart/form-data" method="post" runat="server" action="[ACTION QUE PROCESSARÁ ESTE CODIGO]">
// REPARE NA OPÇÃO ENCTYPE="MULTPART/FORM-DATA" METHOD="POST" ELA QUE IRÁ PASSAR A INFORMAÇÃO DO ARQUIVO DE UPLOAD, SEM ELA O HTML NÃO ENVIA O ARQUIVO PARA A MEMORIA DO SERVIDOR
// Content => PASSAR O VALOR DE REQUEST.CONTENT;
// Chave => PASSAR O VALOR DE REQUEST.CONTENTFIELDS.STRINGS[0]; // ZERO PORQUE ELE IRÁ RETORNAR NA POSIÇÃO ZERO A CHAVE DE IDENTIFICAÇÃO DAKELE POST
// NomeCampo => NOME DO TEXTFIELD QUE SE DESEJA RESGATAR A INFORMAÇÃO
S := Content;
Delete(S, 1, pos(NomeCampo, S) + length(NomeCampo) + 1);
Result := copy(S, 1, pos(Chave, S) - 2);
end;

function NomeOriginalArqMultipartFormData(const Content: String; Chave: String): String;
Var
 S : String;
begin

// NO HTML INFORMAR: form enctype="multipart/form-data" method="post" runat="server" action="[ACTION QUE PROCESSARÁ ESTE CODIGO]">
// REPARE NA OPÇÃO ENCTYPE="MULTPART/FORM-DATA" METHOD="POST" ELA QUE IRÁ PASSAR A INFORMAÇÃO DO ARQUIVO DE UPLOAD, SEM ELA O HTML NÃO ENVIA O ARQUIVO PARA A MEMORIA DO SERVIDOR
// Content => PASSAR O VALOR DE REQUEST.CONTENT;
// Chave => PASSAR O VALOR DE REQUEST.CONTENTFIELDS.STRINGS[0]; // ZERO PORQUE ELE IRÁ RETORNAR NA POSIÇÃO ZERO A CHAVE DE IDENTIFICAÇÃO DAKELE POST
S := Content;
Delete(S, 1, pos('filename', S) + length('filename') + 1);
Result := copy(S, 1, pos('Content-Type:', S) - 4);
end;

function ValorArquivoMultipartFormData(const Content: String; Chave, TipoArquivo: String): String;
Var
 S : String;
begin
// NO HTML INFORMAR: form enctype="multipart/form-data" method="post" runat="server" action="[ACTION QUE PROCESSARÁ ESTE CODIGO]">
// REPARE NA OPÇÃO ENCTYPE="MULTPART/FORM-DATA" METHOD="POST" ELA QUE IRÁ PASSAR A INFORMAÇÃO DO ARQUIVO DE UPLOAD, SEM ELA O HTML NÃO ENVIA O ARQUIVO PARA A MEMORIA DO SERVIDOR
// Content => PASSAR O VALOR DE REQUEST.CONTENT;
// Chave => PASSAR O VALOR DE REQUEST.CONTENTFIELDS.STRINGS[0]; // ZERO PORQUE ELE IRÁ RETORNAR NA POSIÇÃO ZERO A CHAVE DE IDENTIFICAÇÃO DAKELE POST
// TipoArquivo => PASSAR O VALOR DE REQUEST.CONTENTFIELDS.STRINGS[3]; // RETORNA O VALOR: EX.:  "Content-Type: application/octet-stream" - OBS. SEM AS ASPAS
// CASO O VALOR NÃO SEJA DA 3ª STRING, FAÇA UM LOOPING PARA PEGAR O TEXTO "Content-Type:" DENTRO DA OPÇÃO CONTENTFIELDS DO REQUEST
// ContentField2 => PASSAR O VALOR DE REQUEST.CONTENTFIELDS.STRINGS[2]; // RETORNA O VALOR: EX.:  [filename="acordosg.sql"] - OBS. SEM AS CHAVES
S := Content;
Delete(S, 1, pos(TipoArquivo, S) + length(TipoArquivo) + 3);
Result := copy(S, 1, pos(Chave, S) - 3);
end;

{
INFORMANDO ESTAS FUNÇÕES NA APLICAÇÃO EU VOU EXPLICAR SOMENTE A VALOR DO ARQUIVO, POIS ELA É A UNICA MAIS CRITICA PARA EXPLICAÇÃO.
COLOQUE UMA NOVA WEBACTION (QUE VAR SER A AÇÃO DO FORMULÁRIO JÁ DESCRITO COM O ENCTYPE)
DECLARE AS VARIAVEIS: }

VAR
F : File;
Arq, LocalArqUpLoad,
ContType : String;
TamArq, TamW, I : Integer;
BEGIN
  try
  ContType := '';
  for i := 0 to Request.ContentFields.Count - 1 do
   begin
    if pos('Content-Type:', Request.ContentFields.Strings[i]) > 0 then
     ContType := Request.ContentFields.Strings[i];
   end; 
   LocalArqUpLoad := 'C:TMP';
   Arq := ValorArquivoMultipartFormData(Request.Content, Request.ContentFields.Strings[0], ContType);
   TamArq := Length(Arq);
   AssignFile(F, LocalArqUpLoad + NomeOriginalArqMultipartFormData(Request.Content, Request.ContentFields.Strings[0]));
   Rewrite(F, 1);
   for TamW := 1 to TamArq do
    begin
     BlockWrite(F, arq[TamW], 1);
    end;
 finally
  CloseFile(f);
 end;
 RESPONSE.CONTENT := 'UPLOAD EFETUADO COM SUCESSO!!!';
 HANDLED := TRUE;
END;

{AS OUTRAS FUNÇÕES VÃO SER PASSADAS CONFORME O DESCRITO NA EXPLICAÇÃODE CADA FUNÇÃO
ESPERO TER AJUDADO E VOTEM NA DICA, CASO VOCÊS NÃO TENHAM ENTENDIDO, POR FAVOR NÃO PONTUE O POST COM UM VALOR BAIXO
ATT. FELIPE LEAL
}
//-----------------------

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.

Max Gehringer