Ir para conteúdo

POWERED BY:

Arquivado

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

lpc

Download de arquivos não funciona

Recommended Posts

Amigos, já pesquisei nos tópicos e artigos e até copiei o código de vários deles, mas acho que estou bobeando em algo, pois não estou conseguindo copiar arquivos de uma pasta do site e gravar em uma pasta de meu computador, usando o PHP. O que preciso é copiar vários arquivos com extensão xml (ou mesmo txt, não tem problema) e gravar no computador. Antes de copiar, quero pegar estes arquivos e copiar em uma pasta chamada backup no mesmo site, mas isso depois eu vejo. Bom, com a ajuda dos fóruns, tenho o seguinte código:

 

$servidor = "ftp.meusite.com.br";
	$usuario = "meusite";
	$senha = "minhasenha";
		$local = "www/remessa";
		$arquivo = " *.xml ";
		$retorno = "home/site/retorno/" . $arquivo; 
	  
	  $conn_id = ftp_connect("$servidor"); 
	  if ( !$conn_id ) 
		{ 
		  echo "<font color='red'>Não foi possível conectar ao servidor <b>$servidor</b>.</font><br>"; 
		} 
		else 
		 { 
		  echo "Conectado ao servidor <b>$servidor</b>.<br>"; 
		  $login_result = ftp_login($conn_id, "$usuario", "$senha"); // login 
		  if ( !$login_result ) 
			{ 
			  echo "<font color='red'>Usuário: <b>$usuario</b> ou senha inválidos.</font><br>"; 
			} 
		  else 
			{ 
			  echo "Autenticação do usuário <b>$usuario</b> realizada com sucesso.<br><br><br>"; 
			  $download = ftp_get($conn_id, "$retorno", "$local", FTP_ASCII); 
			  if (!$download) 
				{  
				  echo "<font color='red'>O download do arquivo <b>$local</b> falhou!</font><br>"; 
				} 
			  else 
				{ 
				  echo "Download do arquivo <b>$local</b> realizado com sucesso.<br>"; 
				} 
			} 
		  ftp_quit($conn_id); // fecha conexão com servidor de FTP 
		}

Infelizmente, quando tento fazer o download, aparece a seguinte mensagem: (troquei no código "*.xml" para "arquivoteste.xml", para teste!)

 

Conectado ao servidor ftp.meusite.com.br.
Autenticação do usuário " meusite " realizada com sucesso.

Warning: ftp_get(home/site/retorno/arquivoteste.xml) [function.ftp-get]: failed to open stream: No such file or directory in /home/meusite/www/download_arq.php on line 71

Warning: ftp_get() [function.ftp-get]: Error opening home/site/retorno/arquivoteste.xml in /home/meusite/www/download_arq.php on line 71
O download do arquivo falhou!

Se puderem me ajudar agradeço muito!

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não está sabendo navegar na estrutura de diretórios. Quando você usa caminhos relativos, será pesquisado a partir do diretório atual em que você se encontra.

 

Supondo que você se encontre em '/home/ususario/', e chamar 'www/remessa', entende-se que você está se referindo à:

/home/ususario/www/remessa/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente você tinha razão, Marcio Leandro: o caminho estava errado. Mas veja que continua dando erro, o que significa que não estou conseguindo dizer onde ele deve gravar o arquivo em meu computador. Como estou usando ubuntu, estou dizendo para gravar em /home/site/retorno. Até alterei,tirando este caminho, mas não tá dando certo. Preciso fazer outros testes.

Agradeço sua ajuda!

 

Paulo

 

O erro que está aparecendo:

Warning: ftp_get(arquivoteste.xml) [function.ftp-get]: failed to open stream: Permission denied in /home/meusite/www/download_arq.php on line 71

Warning: ftp_get() [function.ftp-get]: Error opening arquivoteste.xml in /home/meusite/www/download_arq.php on line 71

O download do arquivo falhou!

Compartilhar este post


Link para o post
Compartilhar em outros sites

DÊ um ls -l na pasta onde está o arquivo que você está tentando baixar o arquivo e posta aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio Leandro, obrigado mais uma vez!

Olhei, usando o gFTP, os arquivos da pasta remessa, e são:

arquivoteste.xml, que está como rwxrwxrwx e,

arquivoteste.txt, que está como rw-r--r--.

Me perdoe, mas estou usando o linux à pouco tempo (php também) e, sinceramente, não sei como dar esse comando lá na pasta (ftp).

(Se eu não conseguir, vou tentar usar um outro código que baixei aqui no imasters e até testei, mas..)

 

Abraços!

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, caso o sistema que você está fazendo esteja em uma sistema Linux, o arquivo está com permissão de leitura para todos.

Os comandos você dá pelo console.

Vou te explicar como funciona essas permissões:

Observe que está separado por pipes, sendo 3 partes: dono, grupo e outros.

Neste caso, o arquivo está com rw (read/write) para o dono, e r (read) para o grupo e outros. Logo, todos podem ler o arquivo.

rw- | r-- | r--
Coloque um script nesta pasta com o código:

<?php
echo realpath(getcwd());
Isto vai te mostrar o caminho absoluto para a pasta, que você vai usar no seu script de ftp.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz como me orientou. Realmente, mostra o caminho completo, como você havia me orientado no início. Só faltava o "/" no início do caminho, que eu não estava usando. Vou tentar de novo...

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Como não está funcionando, resolvi procurar mais alguma coisa (putz, aprender dá um trabalho!!) e inclui uma rotina para listar os arquivos da pasta. Esta parte está funcionando legal, tanto que aparece o nome do arquivo certinho na resposta de erro. Menos mal. O problema, então, esta na hora de fazer o download propriamente dito. Se puderem dar uma olha no código abaixo e na mensagem de erro, agradeço muito! Creio que é um erro comum a outros também...

 

Abraços!

 

// ===== download arquivo ============================
	
$servidor = "ftp.meusite.com.br";
$usuario = "meusite";
$senha = "minhasenha";
$local = "/remessa";
$tipos = array("xml","txt");	//"jpe", "jpeg", "gif", "png"

			// endereço do diretório
			$diretorio = 'remessa/'; 
			// abre o diretório
			$ponteiro  = opendir($diretorio);
			// monta os vetores com os itens encontrados na pasta
			while ($nome_itens = readdir($ponteiro)) 
				{
					$itens[] = $nome_itens;
				}

			sort($itens);
 
			foreach ($itens as $listar) 
			  {
				  if ($listar!="." && $listar!="..")
					   { 
			   		 if (is_dir($listar)) 
			   		{ 
					  $pastas[]=$listar; 
					} 
					else
					{ 
					  if (in_array(strtolower(end(explode(".",$listar))), $tipos)) 
					 { 
						$arquivos[]=$listar; 
					 };
				   }
			 }
			 }
			
			  // lista as pastas se houverem
			  echo "Lista de arquivos da pasta ".$local;
			  echo "<br />";
			  if ($pastas != "" ) 
			  { 
				foreach($pastas as $listar)
				{
				   print "Pasta: <a href='$listar'>$listar</a><br>";
				}
			  }
			  // lista os arquivos se houverem
			  if ($arquivos != "") 
			  {
				foreach($arquivos as $listar)
				{
				  print " » <a href='$listar'>$listar</a><br>";
				}				   
			  }
		//faço a conexão para poder fazer o download
			 $conn_id = ftp_connect("$servidor"); // conexão com servidor de FTP 
		  if ( !$conn_id ) 
		  { // checa conexão 
			echo "<font color='red'>Não foi possível conectar ao servidor <b>$servidor</b>.</font><br>"; 
		  }
		  else
		  {
			  echo "<br />Conectado ao servidor <b>$servidor</b>.<br>"; 
			  $login_result = ftp_login($conn_id, "$usuario", "$senha"); // login
			  if ( !$login_result ) 
				{ // checa usuário e senha 
				  echo "<font color='red'>Usuário: <b>$usuario</b> ou senha inválidos.</font><br>"; 
				} 
				else 
				{
				  echo "Autenticação do usuário <b>$usuario</b> realizada com sucesso.<br><br>";
	 				foreach($arquivos as $listar)
						{
						  $arqretorno = "/var/www/site/retorno/".$listar;
						  $download = ftp_get($conn_id, "$arqretorno", "$listar", FTP_ASCII);
					  if (!$download) 
					{  // checa download do arquivo 
					  echo "<font color='red'>O download do arquivo <b>$listar</b> falhou!</font><br>"; 
					} 
					else 
					{ 
					  echo "Download do arquivo <b>$listar</b> realizado com sucesso.<br>"; 
					} 
						}					 
				}			  
		  } 

	  //	ftp_quit($conn_id); // fecha conexão com servidor de FTP		
 
//===== fim download arquivo txt ========================

Como resposta, aparece uma lista com todos os arquivos de teste que coloquei na pasta e, na mensagem de erro, aparece o nome destes arquivos, o que significa que estou conseguindo ler todos e na hora de fazer o download são eles que estou tentando copiar. Mas não sei o que estou fazendo de errado que não consigo efetuar a cópia para meu computador. Será que é porque o site está hospedado em um servidor remoto (nem sei onde??)

Abaixo, copiei o retorno do código com a mensagem de erro de alguns arquivos...

 

Lista de arquivos da pasta /remessa
» 1234567890_20081227_145126_arquivoteste.xml
» 1234567890_27122008_arquivoteste.xml
» 1234567890_2712_arquivoteste.xml
» 1234567890_arquivoteste.xml
» 1234567890arquivoteste.xml
» 71753297000104_20081227_145447_arquivoteste.xml
» 71753297000104_20081227_145712_arquivoteste.xml
» arquivoteste.xml

Conectado ao servidor ftp.meusite.com.br.
Autenticação do usuário meusite realizada com sucesso.

Warning: ftp_get() [function.ftp-get]: open_basedir restriction in effect. File(/var/www/site/retorno  /1234567890_20081227_145126_arquivoteste.xml) is not within the allowed path(s): (/home/meusite/:/usr/share/pear/:/var/lib/php/:/tmp/) in /home/meusite/www/download_arqteste.php on line 123   -----> (/var/www/site/retorno é uma pasta de MEU computador)......

Warning: ftp_get(/var/www/site/retorno/1234567890_20081227_145126_arquivoteste.xml) [function.ftp-get]: failed to open stream: Operation not permitted in /home/meusite/www/download_arqteste.php on line 123

Warning: ftp_get() [function.ftp-get]: Error opening /var/www/site/retorno/1234567890_20081227_145126_arquivoteste.xml in /home/meusite/www/download_arqteste.php on line 123
O download do arquivo 1234567890_20081227_145126_arquivoteste.xml falhou!

Warning: ftp_get() [function.ftp-get]: open_basedir restriction in effect. File(/var/www/site/retorno/arquivoteste.xml) is not within the allowed path(s): (/home/meusite/:/usr/share/pear/:/var/lib/php/:/tmp/) in /home/meusite/www/download_arqteste.php on line 123

Warning: ftp_get(/var/www/site/retorno/arquivoteste.xml) [function.ftp-get]: failed to open stream: Operation not permitted in /home/meusite/www/download_arqteste.php on line 123

Warning: ftp_get() [function.ftp-get]: Error opening /var/www/site/retorno/arquivoteste.xml in /home/meusite/www/download_arqteste.php on line 123
O download do arquivo arquivoteste.xml falhou!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É porque você não pode ler um diretório que não é seu, isso é uma quebra de segurança:

 

Você tentou ler:		/var/www/site/retorno  /1234567890_20081227_145126_arquivoteste.xml)
Você pode ler:		  /home/meusite/
A partir do diretório: /home/meusite/www/download_arqteste.php

E dê uma olhada neste espaço em branco que existe aqui:

/var/www/site/retorno  /1234567890_20081227_145126_arquivoteste.xml

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio Leandro, você é muito claro em suas explicações! Legal!

Você disse que eu tentei ler em var/www/site/retorno. Certo! Estou tentando gravar nesta pasta o arquivo que estou copiando lá do site (ftp). Vou alterar o endereço da pasta que irá receber esta cópia para minha pasta home. Pelo que entendi o problema não está lá no ftp mas sim no código, onde tento gravar em uma pasta que não está no meu /home, mesmo com permissão de escrita. Estou certo?

 

Abraços!

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isto mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops!

 

Lista de arquivos da pasta /remessa
» 1234567890_20081227_145126_arquivoteste.xml
» 1234567890arquivoteste.xml
» arquivoteste.xml

Conectado ao servidor ftp.meusite.com.br.
Autenticação do usuário meusite realizada com sucesso.

Warning: ftp_get(home/paulo/www/1234567890_20081227_145126_arquivoteste.xml) [function.ftp-get]: failed to open stream: No such file or directory in /home/meusite/www/download_arqteste.php on line 120

Warning: ftp_get() [function.ftp-get]: Error opening home/paulo/www/1234567890_20081227_145126_arquivoteste.xml in /home/meusite/www/download_arqteste.php on line 120
O download do arquivo 1234567890_20081227_145126_arquivoteste.xml falhou!

Bom, fiz a alteração da pasta que deve receber o arquivo do download, passando de /var/www/site/retorno/ para a pasta home/paulo/www/ (tirei a barra / antes de home porque estava aparecendo uma terceira mensagem de erro, como no post anterior, mas não resolveu. Infelizmente ainda não sei o suficiente de PHP para poder analizar o que pode ser, mas o código a seguir:

$download = ftp_get($conn_id, "$arqretorno", "$listar", FTP_ASCII);
possui o $arqretorno, que é o "home/paulo/www" + $listar, resultando em home/paulo/www/123456....arquivoteste.xml, que é o que quero copiar;

possui o $listar, que é o arquivo que está hospedado no ftp, em /home/meusite/www/remessa e que, no código, coloquei como /remessa e está sendo lido e armazenado em $listar, tanto que aparece a listagem dos arquivos que estão na pasta, e que uso em ftp_get. Resumindo: será que pode ter alguma restrição ou configuração por parte de quem faz a hospedagem do site, que dificulta a utilização deste ftp_get? Será que é alguma configuração?

Abraços e desculpem se estou sendo insistente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro agora é outro. Tá dizendo que o arquivo não foi encontrado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exato, Marcio! Acho que é porque deixei como "home/paulo/www".$listar e não como "/home/paulo/www".$listar. Veja a mensagem que aparece quando faço desta forma:

 

Warning: ftp_get() [function.ftp-get]: open_basedir restriction in effect. File(/home/paulo/www/arquivoteste.xml) is not within the allowed path(s): (/home/meusite/:/usr/share/pear/:/var/lib/php/:/tmp/) in /home/meusite/www/download_arqteste.php on line 120

Warning: ftp_get(/home/paulo/www/arquivoteste.xml) [function.ftp-get]: failed to open stream: Operation not permitted in /home/meusite/www/download_arqteste.php on line 120

Warning: ftp_get() [function.ftp-get]: Error opening /home/paulo/www/arquivoteste.xml in /home/meusite/www/download_arqteste.php on line 120
O download do arquivo arquivoteste.xml falhou!

Minha pasta pessoal, em home, aparece como drwxr-xr-x, que acredito ser o normal do linux. Será que posso alterar? Ou de /home?

 

Obrigado pela paciência!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o teste deixando a pasta home e paulo como drwxrwxrwx (usei chmod 777) só por via das dúvidas. Não é este o problema. Sei não...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não adianta, você nunca vai conseguir ler uma pasta que não é sua.

Você só pode ler o que está dentro de:

echo realpath($_SERVER['DOCUMENT_ROOT']);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, deixa eu ver se eu entendi: eu até consigo ler o conteúdo de www/remessa, mas não vou poder copiar estes dados? Só poderia fazer isso se estivessem na pasta raiz? Ou se o servidor estivesse em minha máquina? Não há outra forma que eu possa usar para buscar estes arquivos lá no servidor, nem que para isso precise alterar as permissões da pasta ou arquivos?

Mais uma vez, obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não. Você não tem acesso a arquivos de outras pastas. Nem pra ler, nem pra executar, nem pra nada. Como a mensagem tá falando:

 

O arquivo : /home/paulo/www/arquivoteste.xml não está no caminho permitido, que é /home/meusite/

 

Você só conseguirá ler dentro do diretório com o caminho permitido, que é o do site, ou seja, /home/meusite/.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi! Bom, vou tentar alterar aqui e ver o que consigo fazer... agradeço sua ajuda e espero conseguir postar aqui como resolvido e assim ajudar a outros também. Se persistir o erro, vou encher mais um pouco...

 

Abraços!

Paulo

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.