Buscar

Upload via Web Server Application - D7

Código

{
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...


CASO QUEIRA VER MEUS OUTROS POSTS SEGUE ABAIXO O ENDEREÇO:

Envio de email (SMTP) usando INDY - Sem componente visual - SSL - Somente Delphi 2010 :
http://www.planetadelphi.com.br/dica/7504/-envio-de-email-(smtp)-usando-indy---sem-componente-visual---ssl---somente-delphi-2010-


Boleto - Codigo de Barras e Linha Digitavel - Delphi 7 :
http://www.planetadelphi.com.br/dica/7300/-boleto---codigo-de-barras-e-linha-digitavel---delphi-7-

Ping Delphi7 com IdIcmpClient:
http://www.planetadelphi.com.br/dica/7284/-ping-delphi7-com-idicmpclient-

Envio de email (SMTP) usando INDY - Sem componente visual - SSL :
http://www.planetadelphi.com.br/dica/7280/-envio-de-email-(smtp)-usando-indy---sem-componente-visual---ssl-

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
}

Publicidade

Vote na dica




Quantidade de votos: 1 voto
Aceitação: 20%


Detalhes da dica

Categoria: Forms
Adicionada dia: 03/11/10
Por: Felipe Leal
Visualizada: 7657 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009