Skip Navigation Links



Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de UsuĆ”rios
»CĆ©lulas AcadĆŖmicas«
intcontpiada : 118
O melhor teclado da microsoft
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
FaƧa um pequeno teste com 10 questƵes de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programaĆ§Ć£o com nosso treinamento on-line de lĆ³gica de programaĆ§Ć£o
.:.
Veja nosso calendƔrio de treinamentos
Gostou da PƔgina?
Então

para um amigo!

Pesquisa personalizada
Pesquisar Dicas:

 






Controlando o download de arquivos


Você também gostará de ler os seguintes artigos
Localizando e consultando arquivos com o FileSystemObject
Após este arquivo você gostará de estudar :

Treinamento de ASP

 




Disponibilizar um arquivo para download é uma das coisas mais simples que existem, basta fazer um link, veja :

<a href="arquivo.zip">Clique para downloadear</a>


Mas controlar o processo de download, como por exemplo, contabilizar quantas vezes o download ocorreu e impedir que pessoas não autorizadas façam o download pode ser bem complicado.

O primeiro problema a resolver é o fato de que, sabendo o nome e onde o arquivo está qualquer um pode digitar o caminho na URL e realizar o download. Para resolver este problema é necessário que os arquivos estejam localizados fora do compartilhamento web, ou seja, em uma pasta do HD não acessível via HTTP.

Mas então ficamos em um dilema : Se os arquivos estarão em uma pasta não acessível via web, como o arquivo será downloadeado ?

Uma página ASP, desde que tenha permissão, pode acessar arquivos em qualquer parte do HD e entrega-los ao usuário. Desta forma podemos criar uma página ASP para provocar o processo de download, mesmo com os arquivos estando inacessíveis diretamente ao usuário.

Isso nos permite também realizar outros controles úteis nesta página ASP tais como : Controle de login (apenas usuários autorizados podem fazer o download) e contagem de download, quantos downloads foram feitos e por quem.

Primeiramente precisamos nos preocupar em fazer uma lista dos arquivos disponíveis para downloadear. Claro que podemos fazer uma lista estática, seria bem simples. Lista.asp chamaria, de forma estática, o arquivo download.asp, passando como parâmetro o nome do arquivo a ser downloadeado.

Mas o mais interessante é criar uma lista dinâmica. Para isso podemos utilizar os recursos do filesystemobject para listarmos todos os arquivos de uma determinada pasta e assim criarmos um sistema dinâmico de download, que nos permite disponibilizar arquivos simplesmente adicionando-os na pasta correta.

Já fizemos anteriormente um artigo sobre o filesystemobject, ele se encontra em http://www.bufaloinfo.com.br/Artigos/artigo1102.asp, portanto o código para exibir todo o conteúdo de uma pasta não é uma grande novidade. Veja o código do Lista.asp :

<html>
<body>
<h1>Arquivos para download</h1>
<%
dim fso
dim pasta
dim arq

set fso=createobject("scripting.filesystemobject")
set pasta=fso.getfolder("c:\download") 'Caminho de exemplo

for each arq in pasta.files
%>
<a href="download.asp?arq=<%=arq.name %>">Clique aqui para fazer o download</a><br>
<%

next
%>

</body>
</html>


O próximo passo, a página download.asp, é um pouco mais complicado. Veja alguns problemas que precisamos resolver nesta página :

a) Precisamos garantir a abertura do arquivo de forma binária, caso contrário alguns downloads não funcionarão. Para fazermos isso podemos utilizar o objeto ADODB.STREAM, adicionado na biblioteca do ADO a partir de sua versão 2.5

b) Nem todo arquivo pode ser disponibilizado através de response.write. Alguns arquivos não-texto exigem que seja utilizado o response.BinaryWrite.

c) O browser tenta reconhecer o tipo de arquivo e pode tentar abri-lo automaticamente. Para evitarmos isso devemos enviar para o browser um cabeçalho indicando que o arquivo deve ser downloadeado, não aberto.

d) Ao tentar downloadear o arquivo o browser tentará grava-lo com o nome da página ASP. O mesmo cabeçalho que mencionamos acima pode ser utilizado também para determinar com que nome desejamos gravar o arquivo na máquina do usuário.


Além disso, claro, temos a parte fácil :

A) Testar o login do usuário, garantindo que o usuário encontra-se logado

B) Registrar o arquivo que foi downloadeado


Veja como fica o código :

<%

if session("username")="" then 'testa o login do usuário
response.redirect("logininvalido.asp")
end if

dim arquivo

arquivo=request.querystring("arq")


Response.AddHeader 'Content-Disposition','attachment;filename=' & right(arquivo,len(arquivo)-instrRev(arquivo,"\"))

Const adTypeBinary = 1

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary 'determina a leitura binária do arquivo
objStream.LoadFromFile arquivo

Response.BinaryWrite objStream.Read ' Imprime utilizando binarywrite

objStream.Close
Set objStream = Nothing

dim cn
set cn=createobject("adodb.connection")
cn.open application("stringdobanco")
cn.execute "insert into downloads (arquivo,usuario,data) values ('" & arquivo & "','" & session("username") & "',getdate() )"
cn.close
set cn=nothing

%>

O registro no banco e o teste de login é apenas exemplo, que você pode personalizar. O importante neste cõdigo é a forma de fazer a leitura e escrita binária do arquivo e forçar o download através do AddHeader.

Dennes Torres
MCSD,MCSE,MCDBA






Envie seus comentįrios sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentįrios nesta pįgina

Veja abaixo os comentários já enviados :

Nome : Chris E-Mail : chrismiller@bol.com.br
Li o artigo "Controlando o download de arquivos", testei e funcionou bem, o único problema é q se no nome do arquivo tiver espaços em branco eu naum consigo fazer o download. Alguem poderia me ajudar?

Obrigada
Nome : Osvaldo E-Mail : osvaldomo@yahoo.com
Chris use o seguinte:


arquivo =replace (arquivo," ","_")
Nome : Emmanuel E-Mail : eferro@bol.com.br
Olá amigo, não funcionou pra mim. O arquivo baixado não corresponde ao arquivo no servidor, enquanto o original tem 17422 kb, o arquivo baixado tem apenas 1kb.
Nome : Thiago E-Mail : thiagofrederick@terra.com.br
cris utilize o seguinte,

arquivo =replace (arquivo," ","%20")

Nome : Serafus E-Mail : serafusma@gmail.com
Caro Dennes, Bom Dia! Editei um E-Book e gostaria de colocarlo no meu Site (www.florestadosguaras.com) para que os visitantes que o solicitem, possam fazer o DownLoad. Não tenho nemhuna prática de programação, desenhei todo o Site com o Front Page e pelo que pude notar, o arquivo ficaria no HD da minha Máquina,correto? que acontece quando ela estiver não conectada?
O arquivo em questão , é um .exe gerado pelo copilador do Programa de E-Book.
Ficaria grato se puder me orientar nesta questão.
Atentamente,
Serafus.
Nome : Diogo E-Mail : dmartins@asert.com.br
boa tarde, estou com problema no download,passo o caminho correto,fiz como esta no tutorial, mas o arquivo nao esta sendo carregado corretamente. o que tenho que fazer para corrigir isso. ?? obrigado.
Nome : Ricardo E-Mail : ricardo.adm@terra.com.br
Olá

estou tendo um problema com este código, o browser me apresenta a seguinte mensagem:
------------------------------------------------------------------------------
Microsoft VBScript runtime error '800a01c2'

Wrong number of arguments or invalid property assignment: 'Response.AddHeader'

/download.asp, line 146
------------------------------------------------------------------------------

O código continua original, com excessão do endereço do arquivo (lógico)
Alguém consegue me dar uma luz sobre o que pode estar acontecendo?
Sei que ele não está atendendo os argumentos, mas tentei de várias formas e ainda não consegui resolver isso.

obrigado
Nome : Marco E-Mail : mac.messa@rocketmail.com
É que nessa parte:

Response.AddHeader 'Content-Disposition','attachment;filename=' & right(arquivo,len(arquivo)-instrRev(arquivo,"\"))

Tem que ser assim:

Response.AddHeader "Content-Disposition","attachment;filename=" & right(arquivo,len(arquivo)-instrRev(arquivo,"\"))

Com o ' vc está comentando o código

Mas o meu não está funcionando mesmo assim, fala que o arquivo (a página no caso) não foi encontrado, talvez o servidor que eu utilize não suporte o ADODB.STREAM...eu acho...¬¬

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Conheça mais sobre o nosso site :

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



Quer saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e
Prepare-se para o Mercado!
Veja o que a Búfalo tem para você.

ļæ½ BĆŗfalo InformĆ”tica, Treinamento e Consultoria - Rua Ɓlvaro Alvim, 37 Sala 920 - CinelĆ¢ndia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br