Prezados,
Depois de muito tempo faço um retorno rápido, mas creio ajudar muitos com esse tutorial.
Devemos tirar esse pensamento de linguagem engessada que o coldFusion tem principalmente no mercado brasileiro, mostrar como ele pode ser poderoso e rápido se o aplicativo for bem programado.
Vamos lá:
Funcionalidades – Carrega um arquivo txt, valida e grava os resultados no banco diretamente.
Para testar acessem meu sistema de newsletter:
http://www.penseache.com.br/adm/newsfusion/login.cfm
Usuário = teste
senha = teste
Vamos aos problemas:
Não podemos esquecer que se trata de uma linguagem web, não tentem carregar arquivos com mais de 20 mil e-mails por que vai demorar, ele foi desenvolvido para carregar com tranqüilidade um txt com no máximo 10 mil e-mails, demora em torno de 5 minutos, dependendo da conexão.
A primeira versão desenvolvi direto em Cold sem nenhum objeto, de forma errada, uma programação ineficiente, com mais calma vi que poderia chamar o objeto java.io.FileReader, que nesse caso grava o conteúdo na memória antes de inserir no banco.
Próximas versões:
Limitar a qtd de e-mails por arquivo para 10 mil no Max.
Verificar a duplicidade dos e-mails cadastrados no perfil. ( acrescentar mais 3 min no carregamento)
Ele carrega arquivos da seguinte forma:
email@provedor.com.br
email@provedor.com.br
.
.
email@provedor.com.br
Um sob o outro, sem espaços, fiz desta forma pois a maioria dos programas que constroem essas listas o fazem desta forma.
Código:
——————teste_carrega2.cfm ———————–
<cfif isDefined(‘form.envia’)>
<!— teste inicio, efetua o upload do txt —>
<cffile action=”Upload” filefield=”arquivo” destination=”#getDirectoryFromPath(getTemplatePath())#” nameconflict=”overwrite”>
<!———— Seta o arquivo ————>
<cfset arquivo = #cffile.serverFile#>
<!—— função que verifica a integridade do e-mail, não foi desenvolvida por mim –à
<cfscript>
function IsEmail(str) {
if (REFindNoCase(“^['_a-z0-9-]+(.['_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*.(([a-z]{2,3})|(aero|coop|info|museum|name))$”,str)) return TRUE;
else return FALSE;
}
</cfscript>
<cfscript>
fr = createobject(“java”,”java.io.FileReader”);
fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);
br = createobject(“java”,”java.io.BufferedReader”);
br.init(fr);
email_errado =0;
email_inserido =0;
queryvirt = queryNew(“NEW_EMAIL”);
while (br.ready()) {
linha = br.readLine();
if(IsEmail(#linha#) EQ “true”){
email_inserido = email_inserido + 1;
QueryAddRow(queryvirt);
QuerySetCell(queryvirt, “NEW_EMAIL” , “#linha#” );
}
else
{
email_errado = email_errado + 1;
}
}
br.close();
</cfscript>
<cfquery name=”queryvirt” dbtype=”query”>
SELECT NEW_EMAIL FROM
queryvirt
</cfquery>
<cfloop query=”queryvirt”>
<cfquery datasource=”#dsn#”>
INSERT INTO T_NEWSLATER
(NEW_EMAIL, NEW_CATEGORIA, email)
VALUES
(‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)
</cfquery>
</cfloop>
</cfif>
————————————————–
Explicando os pontos importantes:
Crio o objeto JAVA java.io.FileReader
fr = createobject(“java”,”java.io.FileReader”);
Carrego o mesmo
fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);
Crio uma query virtual para armazenar os valores antes dos mesmos serem validados
queryvirt = queryNew(“NEW_EMAIL”);
Se o retorno da função for “true” incrementa as variáveis
if(IsEmail(#linha#) EQ “true”){
email_inserido = email_inserido + 1;
Aqui vem o pulo do gato:
1 Faço um select na no e-mail
2 Faço um loop inserindo os e-mails no banco
<cfquery name=”queryvirt” dbtype=”query”>
SELECT NEW_EMAIL FROM
queryvirt
</cfquery>
<cfloop query=”queryvirt”>
<cfquery datasource=”#dsn#”>
INSERT INTO T_NEWSLATER
(NEW_EMAIL, NEW_CATEGORIA, email)
VALUES
(‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)
</cfquery>
</cfloop>
Ai vem o código completo:
O mesmo foi escrito bem rápido, desculpe pela identação, não tive muito tempo, estou programando para o Governo.
<cfif not isDefined(“session.admin”) or not isDefined(“session.usuario”)>
<cflocation url=”login.cfm”>
</cfif>
<cfif isDefined(‘form.envia’)>
<!— teste inicio —>
<cffile action=”Upload” filefield=”arquivo” destination=”#getDirectoryFromPath(getTemplatePath())#” nameconflict=”overwrite”>
<!———— Seta o arquivo ————>
<cfset arquivo = #cffile.serverFile#>
<cfscript>
function IsEmail(str) {
if (REFindNoCase(“^['_a-z0-9-]+(.['_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*.(([a-z]{2,3})|(aero|coop|info|museum|name))$”,str)) return TRUE;
else return FALSE;
}
</cfscript>
<cfscript>
fr = createobject(“java”,”java.io.FileReader”);
fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);
br = createobject(“java”,”java.io.BufferedReader”);
br.init(fr);
email_errado =0;
email_inserido =0;
queryvirt = queryNew(“NEW_EMAIL”);
while (br.ready()) {
linha = br.readLine();
if(IsEmail(#linha#) EQ “true”){
email_inserido = email_inserido + 1;
QueryAddRow(queryvirt);
QuerySetCell(queryvirt, “NEW_EMAIL” , “#linha#” );
}
else
{
email_errado = email_errado + 1;
}
}
br.close();
</cfscript>
<cfquery name=”queryvirt” dbtype=”query”>
SELECT NEW_EMAIL FROM
queryvirt
</cfquery>
<cfloop query=”queryvirt”>
<cfquery datasource=”#dsn#”>
INSERT INTO T_NEWSLATER
(NEW_EMAIL, NEW_CATEGORIA, email)
VALUES
(‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)
</cfquery>
</cfloop>
</cfif>
<style type=”text/css”>
<!–
.style1 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
.style2 {color: #FF0000}
#apDiv1 {
position:absolute;
left:0px;
top:0px;
width:277px;
height:93px;
z-index:1;
}
–>
</style>
<body topmargin=”0″ leftmargin=”0″>
<form action=”teste_carrega2.cfm” method=”post” enctype=”multipart/form-data”>
<table width=”274″ border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr>
<td colspan=”2″> <span class=”style1″>Carregar arquivo de lista (texto)</span></td>
</tr>
<tr>
<td colspan=”2″><cfif isDefined(‘form.envia’)><table width=”276″ border=”0″ cellpadding=”0″ cellspacing=”0″ class=”style1″>
<tr>
<td width=”84″ bgcolor=”#CCFF33″>Inseridos</td>
<td width=”192″ bgcolor=”#CCFF33″><cfoutput><span class=”style2″>#email_inserido#</span></cfoutput></td>
</tr>
<tr>
<td bgcolor=”#CCFF33″>Errados</td>
<td bgcolor=”#CCFF33″><cfoutput><span class=”style2″>#email_errado#</span></cfoutput></td>
</TR>
</table>
</cfif></td>
</tr>
<tr>
<td width=”56″ class=”style1″>Arquivo</td>
<td width=”218″><input name=”arquivo” type=”file” class=”style1″ id=”arquivo”></td>
</tr>
<tr>
<td class=”style1″>Categoria</td>
<td><input name=”categoria” type=”text” class=”style1″ id=”categoria”></td>
</tr>
<tr>
<td> </td>
<td><div align=”right”>
<input name=”envia” type=”submit” class=”style1″ id=”envia” value=”Carregar lista” />
</div></td>
</tr>
</table>
</form>
O algoritmo acima está funcional, basta criar o CFM e se divertir…
O programa pode ser muito otimizado ainda, vocês tem inteira liberdade para tal.
Grande abraço e bom 2009 !
Diogo Romano Souza
MSN vibeair@hotmail.com
Últimos Comentários