Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xanburzum

[Resolvido] Salvar Como

Recommended Posts

Para forçar o navegador para exibir o Salvar como, quando você abre um arquivo no seu navegador, clicando em um link ou digitando uma URL na barra de endereços, o navegador analisa o tipo de conteúdo do arquivo que você está solicitando. Com base neste tipo de conteúdo, o navegador determina qual a acção a tomar. Ele procura uma lista de "pedidos de registo" para ver se um deles está configurado para lidar com o tipo de conteúdo solicitado.

 

Se, no entanto, você passa o navegador de um tipo de conteúdo que não conhece, ele automaticamente apresenta-o com o diálogo Salvar como. Alterando o tipo de conteúdo é fácil em ASP, basta definir a propriedade ContentType do objeto Response to application / x-unknown:

 

Response.ContentType = "application/x-unknown"

Depois de ter definido o tipo de conteúdo, você pode passar o nome do download para o navegador. Este nome será apresentado como o nome padrão para o download. O usuário pode alterar este nome, no entanto. O bloco seguinte de código declara duas variáveis, uma para o nome completo do arquivo que você deseja enviar para o navegador. Neste caso, o código irá enviar um documento do Microsoft Word para o navegador. A outra variável irá conter o nome como aparece no diálogo Guardar como no navegador:

 

Dim FileName
Dim FullFileName 
FileName = "DocumentoWord.doc"
FullFileName = "C:\Webfiles\DocumentoWord.doc"

Com os nomes de arquivos feito, é hora de definir o nome para o arquivo de download. Você precisará usar o método AddHeader do objeto Response para fazer isso. O chr (34) é usado para enviar uma aspas duplas para o navegador.

O método BinaryWrite vai escrever a matriz de variante a assinatura de um caractere ,byte . Para obter esta matriz Variant, você pode usar um objeto ADODB.Stream. Para facilitar o acesso ao objeto Stream, uma função chamada GetBinaryFile que instancia e inicializa o objeto. Como um parâmetro que espera a localização completa do arquivo no disco, por exemplo: C: \ webfiles \ DocumentoWord.doc. Por razões de simplicidade, a função é incluída na página ASP, mas você pode colocar essa função em um arquivo de inclusão, as páginas para que outros possam acessá-lo também.

 

Response.Addheader "Content-Disposition", _
	"attachment; filename=" & chr(34) & FileName & chr(34) 
Response.Binarywrite GetBinaryFile(FullFileName)

O método GetBinaryFile cria uma instância do objeto ADODB.Stream chamando Server.CreateObject e passando-o ProgID ADODB.Stream. O fluxo é aberto e seu tipo setado para adTypeBinary (para indicar que você está enviando um arquivo binário e não em texto simples). O método LoadFromFile irá carregar o arquivo no FileSpec do disco, e em seguida, o método Read lê o conteúdo inteiro. Como esse código é executado em uma função, não se deve enviar a saída do Stream para o objeto de resposta directa. Em vez disso, ele é devolvido a partir da função, estabelecendo a igualdade nomedafunção o resultado do Read () método (GetBinaryFile objStream.Read = ()).

Function GetBinaryFile(ByVal FileSpec)
  Const adTypeBinary = 1
  Dim objStream
  Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Open
  objStream.Type = adTypeBinary
  objStream.LoadFromFile (FileSpec)
  GetBinaryFile = objStream.Read()
  Set objStream = Nothing
End Function

O código de chamada, usar o método BinaryWrite para transmitir o arquivo para o navegador:

 

 

Response.Binarywrite GetBinaryFile(FullFileName)

Assegurar o acesso ao arquivo

 

Este exemplo usa um arquivo codificado para o arquivo que deseja transmitir para o navegador. Em um site real, isto não é uma solução muito útil.

Em vez disso, você pode fazer essa página dinâmica de modo que você pode passá-lo a identificação de um arquivo que você deseja fazer o download através da QueryString. Você pode então transformar esse ID em um arquivo através de uma pesquisa de banco de dados, um arquivo de texto, uma instrução Select Case, ou qualquer outra solução que você pode vir acima com. O código a seguir demonstra o princípio geral:

 

 

 

Dim FileID
FileID = Request.QueryString("ID")
If Len(FileID) > 0 Then
 'Passe a identificação de um banco de dados e recuperar o nome do arquivo
  'FullFileName = Obter o nome do arquivo do banco de dados
Else
  'Invalido ID
End If

'Resto do download do código com o método GetBinaryFile vai aqui. [/ code]

Se você salvar o arquivo com o código de download como DownloadFile.asp, você pode chamar a esta página como esta:

<a href="Download.asp?ID=33">Baixe este arquivo agora</a>
<a href="Download.asp?ID=34">Ou baixar esse outro arquivo Agora</a>

Como você pode ver, o ID do arquivo é transmitido para DownloadFile.asp. Dentro deste arquivo, a identificação é usada para uma pesquisa de banco de dados que recupera o nome completo

Adicionado Benefícios de usar um objeto Stream

Ao enviar o arquivo para o navegador, usando o objeto de fluxo, é mais fácil de proteger seus arquivos. Normalmente, quando você deseja fornecer um arquivo o usuário pode baixar, o arquivo deve estar dentro do escopo do seu site, por exemplo www.yoursite.com / Downloads / arquivo.doc. Isto significa que as pessoas que conhecem o URL do arquivo, pode baixá-lo diretamente. Se você deseja proteger o arquivo, você pode pedir um nome de usuário e senha, antes de redirecionar os usuários para esse URL. Se, no entanto, as pessoas já sabem o URL ou pode adivinhar o seu nome, eles podem contornar o mecanismo de proteção. Tudo o que precisa fazer é digitar a URL do arquivo diretamente e podem ter acesso a ele.

Com a solução apresentada aqui, é mais fácil bloquear o acesso a seu arquivo. Tudo que você precisa fazer é verificar as credenciais do usuário (ou quaisquer outras regras de negócio você pode estar usando) no topo da DownloadFile.asp. Se você não quiser que o seu usuário para continuar, basta redirecioná-los longe de baixar o arquivo, como mostrado no código pseudo que se segue:


[code]' Check User Rights Here
If UserOK Then
 'Use o ID da QueryString para procurar o FileName
  'Transmitir o arquivo para o browser
Else
  Response.Redirect("Bloqueado.asp")
  Response.End 
End If

Dessa forma, os usuários que você não será capaz de acessar o arquivo, se eles não têm permissão para fazer o download. Em vez disso, eles serão redirecionados para a página: Bloqueado.asp.

 

Desvantagens do método Stream.

 

Nem todos os navegadores irá lidar com o nome proposto corretamente. Quando você baixar o arquivo no Netscape, por exemplo, é isso que você verá:

 

Netscape acha que seu download de um arquivo ASP, ao invés de um documento do Word. Assim que você clicar em Salvar este arquivo em disco e clique em OK, o Netscape irá usar o nome proposto (DocumentoWord.doc) para o download.

 

Cada navegador lida com isso de forma diferente; Mozilla e Netscape, por exemplo, usa o nome proposto, mas acrescenta uma extensão ASP. Na verdade, o problema com estes browsers é pior ainda que eles também usam isso. Asp no nome do arquivo proposto na Digite o nome do arquivo para salvar caixa de diálogo. Seus usuários terão de renomear manualmente o arquivo removendo a extensão adicional para torná-lo um arquivo válido. Versões mais recentes do Mozilla (versão 1.6) manipula o arquivo baixado corretamente, e propõe a DocumentoWord.doc como o nome do arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.