Ir para o conteúdo
AntonioGraca

Download do servidor através de link

Mensagens Recomendadas

AntonioGraca

Olá

Estou aqui com um problema que não consigo resolver. Já fiz várias tentativas e a coisa não vai.

1 - Preciso criar um botão (imagem) com um link que possa descarregar um pdf que já foi criado e está armazenado no servidor.

Imagem_botao= images/athletic_run/butt_pdf_2.png

2 - O nome do ficheiro a descarregar foi atribuído automaticamente (quando criado) através de uma variável.

caminho_ficheiro= fpdf_downloads/

variável_nome_ficheiro=$nome_ficheiro

3 - Mas preciso também prevenir que o utilizador não tenha acesso aos restantes ficheiros dessa pasta.

4 – Para que o servidor não fique sobrecarregado, preciso também apagar o ficheiro cada vez que este for descarregado.

Cumprimentos de

António Graça

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1 - Preciso criar um botão (imagem) com um link que possa descarregar um pdf que já foi criado e está armazenado no servidor.

<a href="ficheiro.pdf"><img src="img.png"/></a>

2 - O nome do ficheiro a descarregar foi atribuído automaticamente (quando criado) através de uma variável.

tens de guardar esse calor em algum lado

3 - Mas preciso também prevenir que o utilizador não tenha acesso aos restantes ficheiros dessa pasta.

necessitas de um sistema de autenticação que avalie se o processo de download é aceito (script)

4 – Para que o servidor não fique sobrecarregado, preciso também apagar o ficheiro cada vez que este for descarregado.

NUNCA faças isso !!! o que vais fazer se o download falhar ?

o que podes fazer seria marcar o ficheiro como descarregado e fazer "manutenção" de X em X tempo, mas nunca apagar imediatamente


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Yoda

Olá. Tudo isto começou porque en não consigo fazer o downlod diretamente do fpdf para o pc, quer dizer, faço o download mas depois o acrobat diz que tem erro. Se o ficheiro foi primeiro para o servidor e o descarregar via ftp o acrobat abre sem problemas. Então, parece ser a solução criar um link (em php, com uma imagem) para correr um ficheiro onde possa estar este codigo para descarregar que parece estar a funcionar bem.

O que eu fiz, com base num script que encontrei...

Fazer o download protegendo os outros ficheiros. Esta parte está a funcionar.

Agora falta criar um link em php para fazer correr este ficheiro e implementar uma rotina para apaga-los.

<?php
   define('DIR_DOWNLOAD', '../fpdf_downloads/');   
   if (stripos($nome_ficheiro, './') !== false || stripos($nome_ficheiro, '../') !== false || !file_exists($nome_ficheiro))
       exit('Operação não permitida.');
    $arquivo = DIR_DOWNLOAD. $nome_ficheiro; 
   header('Content-type: octet/stream');
   header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
   header('Content-Length: '.filesize($nome_ficheiro));
   readfile($nome_ficheiro);
   exit;
?>

Obrigado

António Graça

<a href="ficheiro.pdf"><img src="img.png"/></a>

Olá Hippo

Afinal, em vez de nesse link tentar fazer o download do pdf vou tentar chamar um ficheiro php com o rotina para downlod e que já coloquei antes. Isto torna-se mais fácil. Mas o problema é que não sei como passar o valor da variável que tem o nome do ficheiro. Por agora, estou a fazer a rotina para download através de um custum code do chronoforms e funciona bem. O valor da variável passa. Mas quando chamar um ficheiro php duvido que vá funcionar... mas vou testar...

Quanto a apagar o pdf depois de ser feito o download, vou ainda ver como fazer pois tens muita razão, é um risco...

Por favor le o que escrevi antes sobre o fpdf, sabes a solução para os ficheiros terem que ir ao servidor para não darem erro ao abrir no acrobat?

Obrigado pela resposta

António Graça

Editado por brunoais
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Por favor le o que escrevi antes sobre o fpdf

...

solução para os ficheiros terem que ir ao servidor para não darem erro ao abrir no acrobat?

afinal os ficheiros estão a ser criado com o FPDF ou estas a enviar por FTP e depois descarrega-los ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

afinal os ficheiros estão a ser criado com o FPDF ou estas a enviar por FTP e depois descarrega-los ?

Criado pelo fpdf diretamente para o servidor já que até agora não encontrei outra solução...

Thanks

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

<?php
define('DIR_DOWNLOAD', '../fpdf_downloads/');

if (stripos($nome_ficheiro, './') !== false || stripos($nome_ficheiro, '../') !== false || !file_exists($nome_ficheiro))
exit('Operação não permitida.');

$arquivo = DIR_DOWNLOAD.$nome_ficheiro; // <--- isto serve para que ? nunca é usado !

header('Content-type: octet/stream');
header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
header('Content-Length: '.filesize($nome_ficheiro));
readfile($nome_ficheiro);
exit;
?>
[/Code]


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Ponto da situação:

Como não vejo outra solução (as outras dão erro), o ficheiro pdf é criado pelo fpdf e enviado para o servidor. Agora é preciso descarrega-lo.

Criei um ficheiro download.php e que consigo passar o valor da variável com o nome do ficheiro. So far so good. Por agora, estou a fazer a rotina para download através de um custum code do chronoforms e funciona bem. O valor da variável passa. O ficheiro descarrega o ficheiro sem erro (coisa que não acontecia antes se ao criar o pdf e envia-lo diretamente para o meu pc).

<?php
define('DIR_DOWNLOAD', '../fpdf_downloads/');  
if (stripos($nome_ficheiro, './') !== false || stripos($nome_ficheiro, '../') !== false || !file_exists($nome_ficheiro))
		exit('Operação não permitida.');
	 $arquivo = DIR_DOWNLOAD. $nome_ficheiro;
header('Content-type: octet/stream');
header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
header('Content-Length: '.filesize($nome_ficheiro));
readfile($nome_ficheiro);
exit;
?>

Mas como chamar esse ficheiro sem ser pelo chronoforms? Então fiz assim em html:

<a href="fpdf/download.php"><img src="images/athletic_run/butt_pdf_1.png" alt="" /></a>

Mas, por esta via, não faz o download, fica uma pagina em branco no browser. Penso que pelo facto do valor da variável (nome_ficheiro) não ter chegado ao download.php.

Ideias?

António Graça

Editado por AntonioGraca
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

e eu volto a perguntar :

<?php
   define('DIR_DOWNLOAD', '../fpdf_downloads/');
   /* onde está incializada a variável "$nome_ficheiro" ? */
   if (stripos($nome_ficheiro, './') !== false ||
       stripos($nome_ficheiro, '../') !== false ||
      !file_exists($nome_ficheiro))
      exit('Operação não permitida.');

   /* a variavel "$arquivo" é usada para que ? */
   $arquivo = DIR_DOWNLOAD. $nome_ficheiro;

   header('Content-type: octet/stream');
   header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
   header('Content-Length: '.filesize($nome_ficheiro));
   readfile($nome_ficheiro);
   exit;
?>


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Olá, mais um vez

O nome e caminho do ficheiro são criados no ficheiro "fpdf_recordes_pessoais_concursos.php" que gera o pdf. Aqui chamado num custom code do chronoforms:

<?php
include('fpdf/imprimir_marcas/fpdf_recordes_pessoais_concursos.php');
?>

Se eu introduzir o codigo que faz o downlod do ficheiro também no custm code, também funciona. Mas eu queria chamar este código através de um link para o ficheiro. Mas aí acho que o valor da varivavel caminho/nome do ficheiro não chega ao ficheiro que é chamado para fazer o download (download.php).

António Graça

Editado por AntonioGraca

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

e eu volto a perguntar :

<?php
define('DIR_DOWNLOAD', '../fpdf_downloads/');
/* onde está incializada a variável "$nome_ficheiro" ? */
if (stripos($nome_ficheiro, './') !== false ||
	stripos($nome_ficheiro, '../') !== false ||
   !file_exists($nome_ficheiro))
   exit('Operação não permitida.');

/* a variavel "$arquivo" é usada para que ? */
$arquivo = DIR_DOWNLOAD. $nome_ficheiro;

header('Content-type: octet/stream');
header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
header('Content-Length: '.filesize($nome_ficheiro));
readfile($nome_ficheiro);
exit;
?>

Pois, isso era que devia ter desaparecido...Esquecimento...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Mais uma vez, ola

Ainda a parte do link não está resolvida e já vou noutra. De acordo com o que escrevi inicialmente, tendo em conta que os ficheiros tem que ser primeiramente gravados para o servidor, preciso criar uma rotina em que, posteriormente, apague os mesmos. Só como ponto de partida, este poderia ser o código a utilizar:

<?php
$ficheiro = ".fpdf_downloads/arquivo.pdf";
$comando = unlink ($fn);
if ($comando){
	 die ("Arquivo excluído!");
}else{
    die ("Erro ao excluir arquivo");
}
?>

Só que eu não vou saber quais os nomes dos ficheiros que foram armazenados no servidor. E, tal como opiniou o hyppo, não os passo apagar na altura em que faço o download.

Então, posteriormente, os ficheiros poderão ser apagados com um risco mínimo de erro. Então, eu não quero apagar um ficheiro específico mas sim todos os ficheiros que foram gravados numa determinada pasta, por exemplo, com a data de há 5 dias atrás. A coisa complicou, como dizer que quero apagar todos os ficheiros de uma determinada pasta (/fpdf_downloads/) com uma data antes de hoje() menos 5 dias?

Obrigado a todos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Olá, voltando à questão do link para fazer download do ficheiro pdf...

Ora bem. Com o código abaixo eu consigo fazer o download do pdf

<?php
include('fpdf/imprimir_marcas/fpdf_recordes_pessoais_corridas_mx.php'); /// aqui é feito o pdf para o servidor e é dado o nome ao ficheiro
$nome_ficheiro=utf8_encode("$nome_ficheiro");
$caminho_pdf='/fpdf_downloads/';
$caminho_pdf.=$nome_ficheiro;
?>

<a href='<?php echo $caminho_pdf; ?>'><img src="images/athletic_run/butt_pdf_1.png" alt="" /></a>

Mas tenho 2 problemas:

1 - Apesar de estar a converter para utf8 os ficheiros com nomes com carateres acentuados o browser dá erro;

2 - A pasta onde está o ficheiro (com outros de outros utilizadores) não fica protegido podendo qualquer um aceder ao conteúdo da mesma.

Voltando à outra solução que era correr um ficheiro em php para descarregar para o pc do utilizador...

<?php
	define('DIR_DOWNLOAD', '../fpdf_downloads/');
		   if (stripos($nome_ficheiro, './') !== false ||
			stripos($nome_ficheiro, '../') !== false ||
	   !file_exists($nome_ficheiro))
	   exit('Operação não permitida.');

	header('Content-type: octet/stream');
	header('Content-disposition: attachment; filename="'.basename($nome_ficheiro).'";');
	header('Content-Length: '.filesize($nome_ficheiro));
	readfile($nome_ficheiro);
	exit;
?>

Este código funciona ultrapassando os 2 problemas da outra solução. Mas neste tenho um problema (aqui é só um):

1 - Como chamar o ficheiro php para correr estas instruções contidas?

Já tentei

<a href="fpdf/download.php"><img src="images/athletic_run/butt_pdf_1.png" alt="" /></a>

e aparece apenas uma página em branco.

Desde já, agradeço a vossa ajuda

António Graça

Editado por AntonioGraca

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AntonioGraca

Olá

No caso de alguém ter um problema idêntico, aí vai a minha solução:

Lembrar que queria fazer o download de um ficheiro pdf do servidor para o pc do utilizador...

Link com a variável do caminho e nome do pdf no servidor. Pelo facto da variável conter um nome do ficheiro terminado em pdf não é preciso imagem para clicar pois aparece automáticamente uma imagem pdf clicável.

<a target="_blank" href='<?php echo $caminho_pdf; ?>'>

Depois tinha outro problema: como "defender" a pasta para que cada utilizador não tivesse acesso aos ficheiros dos restantes utilizadores. A solução é muito simples mas demorou a parecer.

Criar um ficheiro index.html vazio e colocar na pasta. Desta maneira já não se tem acesso aos restantes documentos.

Fantástico!

Resolvido!

Editado por AntonioGraca

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.