Download com registro de dados

(waae) #1

Tenho uma consulta onde existe um campo tipo “Arquivo (nome do arquivo)”. Nele o usuário deveria conseguir fazer o download desse arquivo, mas o problema é que eu precisava registrar os dados do usuário que está fazendo o download, data, hora… . Como não consegui fazer nenhum evento registrar esses dadosqdo o usuário clicasse sobre o arquivo para baixar, forcei ele a entrar em um controle onde no botão “Download” ele baixa o arquivo e o Sistema registra os dados. Até ai ok!!!
Só que aquele negócio do IE bloqueia o download da primeira vez… ai se a gente libera pro IE fazero download, ele pede “repetir” ou “cancelar”, se coloca o “repetir” ele não faz nada… ai tem que entrar na consulta de novo, entrar no controle e só assim faz o download…
Como faço pra tirar toda essa “burocracia” pq isso tá stressando todo mundo !!!
Agradeço a quem ajudar!!!

(system) #2

Amigo,

Esse problema no IE ocorre quando a página tenta realizar o download automaticamente, não?
Nesse controle que criou, se vc colocar um campo label com um link para o arquivo de download, imagino que não acontecerá isso…

// Evento onLoad da aplicação controle $arquivo = [variavel_com_nome_do_arquivo_para download]; {campo_label} = "<a href='/pasta/padrao/dos/arquivos/".$arquivo."'> Realizar download </a>";

Acho que dá pra fazer uma pequena adaptação na consulta pra não precisar usar esse controle… estava tentando alguma coisa aqui, mas parei no 6º item e não consegui fazer funcionar:

1º - Criei um novo campo tipo texto, chamado “acao_download”;

2º - Criei um botão PHP chamado “btndownload”;

3º - Escondi o botão (btndownload) da barra de ferramentas;

4º - Escondi o campo que contem o arquivo de download, usando a macro sc_field_display (no evento onInit da consulta);

5º - No evento onRecord, coloquei o seguinte:

[code]{acao_download}="<input type=image name=‘sc_btndownload’ onclick=sc_btn_btndownload(); return false; title=‘Download’ border=0 src=".$this->Ini->path_botoes."/sys__NM__link.png align=absmiddle>";

//Créditos.: essa solução foi adaptada do exemplo do Haroldo, na comunidade scriptcaseajax (www.scriptcaseajax.com.br).[/code]

6º - No código php do botão criado, executar as rotinas para salvar os dados no banco e mostrar o link do download.

O problema no 6º item é que não consigo passar as variáveis e o conteúdo dos campos da aplicação pro botão PHP que foi criado… O conteúdo deste botão deveria ser algo parecido com isso:

sc_exec_sql("INSERT INTO .... "); // gravar dados do acesso no banco
echo "<a href='/pasta_dos_arquivos/".{campo_arquivo}."'> Realizar Download </a>";

Se eu descobrir uma forma de fazer isso eu posto aqui…

Att.
Robson

(William .&#039;.) #3

Waee,

Está é uma caracteristica do proprio IE, então não existe como mudar via programação, o que pode ser feito é configurar as propriedades de Zona do navegador para desabilitar esta maldita ‘barrinha’.

WSCA .’.

(system) #4

William,

Posso estar falando besteira pois não utilizo o IE há um bom tempo, mas pelo o que me lembro essa tal “barrinha” só aparece quando a página tenta iniciar um download sem uma ação direta do usuário, certo? Acontecia constantemente na página do superdownloads por exemplo… Mas se for um link direto pro arquivo, onde o usuário clique nele para realizar o download, a barrinha não aparece e a janela de download abre diretamente, não?

Talvez nesta aplicação do Waee o download esteja sendo executado através de um script (num evento ou em algum botão). Acho que esse problema será resolvido se realizar o download através de um link…

Att.
Robson

(William .&#039;.) #5

Robson, Vc tem razão !!

Waee desculpe o equivoco amigo, acredito que a solução do Robson deva funcionar…

WSCA .’.

(Rodrigo Lins) #6

Bom Dia Robson,

Tente fazer os passos que você disse que não conseguiu, conforme expliquei neste tópico:

http://www.netmake.com.br/forum/index.php?topic=1275.0;topicseen

Que seria através de variável global.

Rodrigo Lins.

(system) #7

Olá Rodrigo, boa tarde!

Esta solução realmente irá funcionar, mas o detalhe é que a aplicação é uma consulta…

Na verdade eu que não percebi um “pequeno” detalhe: apesar de estar chamando a função do botão em cada linha da consulta, o botão é o mesmo para toda a aplicação… e mesmo tentando registrar a variável global no evento onRecord, cada nova linha carregada na consulta irá apagar o valor na sessão e setar o valor da nova linha.

O mais fácil é criar uma ligação com uma aplicação controle mesmo, como ele fez logo no início…

Mas pra quem gosta de complicar as coisas, dá pra fazer algo assim:

1º - Criar um novo campo tipo texto, chamado “acao_download”;

2º - No evento onInit da consulta, esconder o campo que contem o arquivo de download e criar a rotina em php:

// Evento onInit da consulta
// Verificar se foi solicitado algum download. Caso positivo, realiza o insert no banco e
// insere o javascript para abrir a janela de download

sc_field_display({campo_arquivo},off);
$arquivo = [alvo];
sc_reset_global([alvo]);
if ($arquivo != NULL)
{
sc_exec_sql("INSERT INTO ...."); //insere dados de acesso no banco
echo "
<script language='javascript'>
janela_download = window.open ('', '', 'height=400, width=400, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, toolbar=no ,top=150,left=300');
janela_download.document.open();
janela_download.document.write ('<html><head><title>Download de arquivo</title></head><body>');
janela_download.document.write ('<a href=/pasta_dos_arquivos/".$arquivo."> Realizar download </a>');
janela_download.document.write ('</body></html>');
janela_download.document.close();
</script>
";
}

3º - No evento onRecord, colocar um formulário (escondido) e uma imagem ou link executando o submit():

// Evento onRecord da consulta (Opção com link)
// obs.: incluí o ID do registro no nome do formulario para não haver vários formularios com o mesmo nome

{acao_download}="<form action='#' name=form".{campo_id}." method=POST><input type='hidden' id='alvo' name='alvo' value='".{campo_arquivo}."'>/form>
<a href='#' onclick='javascript:document.form".{campo_id}.".submit()'> Download </a>";

ou:

// Evento onRecord da consulta (Opção com imagem)
// obs.: incluí o ID do registro no nome do formulario para não haver vários formularios com o mesmo nome

{acao_download}="<form action='#' name=form".{campo_id}." method=POST><input type='hidden' id='alvo' name='alvo' value='".{campo_arquivo}."'>/form>
<input type=image name='sc_btndownload' onclick='javascript:document.form".{campo_id}.".submit()' title='Download' border=0 src=".$this->Ini->path_botoes."/sys__NM__link.png align=absmiddle>

neste exemplo estou supondo que o nome do campo “arquivo” seja {campo_arquivo}, e do campo com o “ID” da linha seja {campo_id}.
Funcionou certinho aqui, mas o problema é que ele faz um “reload” da página em cada download, o que pode não ser muito viável…

Att.
Robson

(Cleyton Euler) #8

Poxa, era uma dúvida que eu tinha e acabei resolvendo com uma página em PHP.

Na consulta usei um link redirecionando para uma página que faz todo o serviço, inclusive o download do arquivo. Ficou legal pq a página abre na iFRAME do SC mesmo. Então é uma solução que uso muito quando o SC me limita em alguma coisa. É o caso da integração com o Google Maps que faço.

Agora com o SC5 ficou ainda melhor pq vc tem a aplicação do tipo Blank.

(waae) #9

Olá galera…
Passei um tempo muito ocupada… por isso não dei continuidade aqui!!
O que aconteceu foi que precisava resolver isso com muita urgencia… entao criei um informativo dentro do painel ensinando como evitar essa Barrinha Chata!!
Tb não consegui outra forma de realizar o Download e registrar os dados a não ser com esse controle!!

Mas vou tentando… qq novidade posto aqui!!
Muito Obrigada a todos que tentaram ajudar!!!

T+