binhofa Postado Maio 19, 2015 Denunciar Share Postado Maio 19, 2015 Olá a todos. Segue o código: _______________________________________________________________________________________ <?php /* Script distribuído por brasilphp.net Qualquer dúvida, escreva para contato@brasilphp.net Para criação e manutenção de scripts e sistemas, escreva para contato@sobralsites.com */ function varSet($VAR) { return isset($_GET[$VAR]) ? $_GET[$VAR] : ""; } $action = varSet("action"); $pasta = base64_decode(varSet("pasta")); //Lista dos arquivos que não serão listados $denyFiles = array(".htaccess","thumbs.db"); if ($action == "download") { $file = base64_decode(varSet("file")); header("Content-disposition: attachment; filename=\"".basename($file)."\""); readfile(".$file"); exit; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR...nsitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Listagem de Arquivos</title> <style type="text/css"> body { font:11px Verdana, Arial, Helvetica, sans-serif; padding:0px; margin:0px; } a { text-decoration:none; color:#003366; } a:hover { color:#0099CC } .row1 { background-color:#F7F7F7 } .row2 { background-color:#EBEBEB } .rowOver { background-color:#C7DCFC } .extCell { font-weight:bold } </style> <script language="javascript" type="text/javascript"> function over(Obj) { nClass = Obj.className Obj.className = "rowOver" Obj.onmouseout = function() { Obj.className = nClass } } </script> </head> <body> <?php if ($action == ""): $fdir = "./$pasta"; chdir($fdir); $dir = opendir("."); while ($file = readdir($dir)) if (is_dir($file)) $dirs[] = $file; else $files[] = $file; $row = 2; ?> <table width="700" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td height="50px;"><strong>P.S:</strong> "listar.php" é o arquivo deste sistema</td> </tr> <tr> <td height="50px;"><strong>Exibindo:</strong> ROOT <?php echo empty($pasta) ? "" : $pasta; ?></td> </tr> </table> <table width="700" border="0" align="center" cellpadding="0" cellspacing="0"> <tr style="font-weight:bold"> <td width="55" height="20"> </td> <td width="204">Nome</td> <td width="130">Tamanho</td> <td width="316">Ações</td> </tr> <?php if ($pasta != ""): ?> <tr class="row<?php echo $row; ?>" onmouseover="over(this)"> <td align="center" width="55" height="20" class="extCell">[DIR]</td> <td><a href="?pasta=<?php echo base64_encode(substr("$pasta",0,strrpos($pasta,"/"))); ?>">..</a></td> <td>--</td> <td> </td> </tr> <?php endif; ?> <?php if (is_array($dirs)) : sort($dirs); foreach ($dirs as $nome): if ($nome == ".." || $nome == ".") continue; if ($row == 2) $row = 1; else $row = 2; ?> <tr class="row<?php echo $row; ?>" onmouseover="over(this)"> <td align="center" width="55" height="20" class="extCell">[DIR]</td> <td><a href="?pasta=<?php echo base64_encode("$pasta/$nome"); ?>"><?php echo $nome; ?></a></td> <td>--</td> <td> </td> </tr> <?php endforeach; endif; ?> <?php if (is_array($files)): sort($files); foreach ($files as $nome): if (in_array(strtolower($nome),$denyFiles)) continue; if ($row == 2) $row = 1; else $row = 2; $tamanho = filesize("./$nome"); $info = pathinfo("./$nome"); ?> <tr class="row<?php echo $row; ?>" onmouseover="over(this)"> <td align="center" width="55" height="20" class="extCell">[<?php echo strtoupper($info["extension"]); ?>]</td> <td><a href="?action=download&file=<?php echo base64_encode("$pasta/$nome"); ?>"><?php echo $nome; ?></a> </td> <td><?php echo $tamanho > 1048576 ? round($tamanho/1048576,2)." Mb" : round($tamanho/1024,2)." Kb"; ?></td> <td> </td> </tr> <?php endforeach; endif; ?> </table> <?php endif; ?> </body> </html> <?php closedir($dir); ?> ____________________________________________________________________________________________ Minha dúvida: Quando efetuo o download de arquivos em Excel, ele corrompe. Sabe me dizer como resolvo isso? Tentei de tudo, mas não consegui solucionar. Obrigado e fico no aguardo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 19, 2015 Denunciar Share Postado Maio 19, 2015 Abre o arquivo que está vindo corrompido com um editor de texto simples (bloco de notas, notepad++, etc) e dá uma olhada no conteúdo dele, as vezes pode ter erro/warning dentro... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Maio 19, 2015 Autor Denunciar Share Postado Maio 19, 2015 Não Stoma. Não tem nenhuma dessas informações. Abre criptografado (abri um xls no notepad). :( Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 19, 2015 Denunciar Share Postado Maio 19, 2015 Eu fiz um teste aqui com o código abaixo (o mesmo que está no seu de download) e funcionou perfeitamente. Você já tentou criar um novo arquivo do Excel e ver se consegue fazer o download? <?php $file = "C:\\teste.xlsx"; header("Content-disposition: attachment; filename=\"".basename($file)."\""); readfile($file); exit; ?> Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Maio 19, 2015 Autor Denunciar Share Postado Maio 19, 2015 Descobri o que causa o corrompimento do arquivo, mas não entendi o motivo e não achei a solução. Seguinte: Esse código que eu listei está dentro do arquivo listar.php na raiz do servidor. Tenho 100 pastas com vários arquivos dentro dela, inclusive um index.php dentro de cada uma delas. Esse arquivo index tem a seguinte linha de código: __________________________________________________________________________________ <? session_start(); if (!$_SESSION["s_login"]) { header('Location: http://www.meusite.com.br/logoff.php'); } ?> <?php include("/home/storage/1/02/23/dominio/public_html/listar.php"); ?> __________________________________________________________________________________ Se ao invés de incluir o listar.php eu colocar o código inteiro, ele faz o download normalmente.... O problema é: imagina se precisar fazer uma alteração? Tenho que mudar de tooooooooodos os index.php das 100 pastas e acaba ficando inviável. Fiz um teste aqui e deu certo. Agora travei. Não consigo sair daqui. Consegue identificar o que seja? Obrigado e fico no aguardo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 19, 2015 Denunciar Share Postado Maio 19, 2015 Habilita os erros/warning para ver o que aparece (coloca no início do index.php e também do listar.php): ini_set("display_errors", 1); error_reporting(E_ALL|E_STRICT); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Maio 19, 2015 Autor Denunciar Share Postado Maio 19, 2015 (editado) No index.php apareceu o erro: _________________________________________________________________________________________________________________________ Notice: A session had already been started - ignoring session_start() in /home/storage/1/02/23/dominio/public_html/pasta/index.php on line 2 Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/Sao_Paulo' for 'BRT/-3.0/no DST' instead in/home/storage/1/02/23/dominio/public_html/pasta/index.php on line 116 _________________________________________________________________________________________________________________________ No listar.php, listou os mesmos erros. Acredito que não seja a questão da data porque eu eliminei a linha de código que informava isso e o problema persistiu. Editado Maio 19, 2015 por binhofa Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 19, 2015 Denunciar Share Postado Maio 19, 2015 Hmm... Tenta utilizar ob_get_clean/ob_end_flush como nesta resposta http://stackoverflow.com/a/9084077 , porque acho que se essas mensagens estiverem sendo impressas na hora do download, elas podem corromper o arqiuvo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Maio 20, 2015 Autor Denunciar Share Postado Maio 20, 2015 (editado) Stoma, Fiz esse procedimento na linha que faz o download e não deu certo. Efetuei um outro teste transformando o arquivo que abre normalmente "somente como leitura" para que não ocorra nenhuma alteração nele, subi na web e fiz o download..... Sem sucesso! :( O que pode ser? Editado Maio 20, 2015 por binhofa Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 20, 2015 Denunciar Share Postado Maio 20, 2015 Eita, tá difícil hein rs Se você criar um novo arquivo do Excel apenas com uma palavra, ainda assim vem corrompido? Dá uma olhada nesse tópico, o usuário tinha esse problema também e conseguiu resolver: http://stackoverflow.com/questions/10198524/php-xlsx-header Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Maio 20, 2015 Autor Denunciar Share Postado Maio 20, 2015 Resolvido Stoma!!!! Graças ao seu link e sua disponibilidade em ajudar, consegui resolver meu problema. Inclui as seguintes linhas em vermelho logo no inicio do código: if ($action == "download") { $file = base64_decode(varSet("file")); header("Content-disposition: attachment; filename=\"".basename($file)."\""); header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Length: ' . filesize($file)); header('Content-Transfer-Encoding: binary'); header('Cache-Control: must-revalidate'); header('Pragma: public'); ob_clean(); flush(); readfile(".$file"); exit; A aplicação do ob_clean() e flush() foi aplicado errado anteriormente, mas dessa forma está correta. Stoma, muito obrigado mesmo. Abs Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Stoma Postado Maio 21, 2015 Denunciar Share Postado Maio 21, 2015 Finalmente! Que bom que deu certo :D A gente ajuda no que pode xD Abraço! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 binhofa Postado Dezembro 22, 2015 Autor Denunciar Share Postado Dezembro 22, 2015 Olá pessoal. Estou reabrindo esse post só pra sanar uma dúvida rápida: Os downloads consigo fazer, porém no Internet Explorer isso não é possível. O que preciso fazer para resolver? Grato e fico no aguardo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
binhofa
Olá a todos.
Segue o código:
_______________________________________________________________________________________
<?php
/*
Script distribuído por brasilphp.net
Qualquer dúvida, escreva para contato@brasilphp.net
Para criação e manutenção de scripts e sistemas, escreva para contato@sobralsites.com
*/
function varSet($VAR) { return isset($_GET[$VAR]) ? $_GET[$VAR] : ""; }
$action = varSet("action");
$pasta = base64_decode(varSet("pasta"));
//Lista dos arquivos que não serão listados
$denyFiles = array(".htaccess","thumbs.db");
if ($action == "download") {
$file = base64_decode(varSet("file"));
header("Content-disposition: attachment; filename=\"".basename($file)."\"");
readfile(".$file");
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR...nsitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Listagem de Arquivos</title>
<style type="text/css">
body {
font:11px Verdana, Arial, Helvetica, sans-serif;
padding:0px;
margin:0px;
}
a {
text-decoration:none;
color:#003366;
}
a:hover { color:#0099CC }
.row1 { background-color:#F7F7F7 }
.row2 { background-color:#EBEBEB }
.rowOver { background-color:#C7DCFC }
.extCell { font-weight:bold }
</style>
<script language="javascript" type="text/javascript">
function over(Obj) {
nClass = Obj.className
Obj.className = "rowOver"
Obj.onmouseout = function() {
Obj.className = nClass
}
}
</script>
</head>
<body>
<?php
if ($action == ""):
$fdir = "./$pasta";
chdir($fdir);
$dir = opendir(".");
while ($file = readdir($dir)) if (is_dir($file)) $dirs[] = $file; else $files[] = $file;
$row = 2;
?>
<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="50px;"><strong>P.S:</strong> "listar.php" é o arquivo deste sistema</td>
</tr>
<tr>
<td height="50px;"><strong>Exibindo:</strong> ROOT <?php echo empty($pasta) ? "" : $pasta; ?></td>
</tr>
</table>
<table width="700" border="0" align="center" cellpadding="0" cellspacing="0">
<tr style="font-weight:bold">
<td width="55" height="20"> </td>
<td width="204">Nome</td>
<td width="130">Tamanho</td>
<td width="316">Ações</td>
</tr>
<?php if ($pasta != ""): ?>
<tr class="row<?php echo $row; ?>" onmouseover="over(this)">
<td align="center" width="55" height="20" class="extCell">[DIR]</td>
<td><a href="?pasta=<?php echo base64_encode(substr("$pasta",0,strrpos($pasta,"/"))); ?>">..</a></td>
<td>--</td>
<td> </td>
</tr>
<?php endif; ?>
<?php
if (is_array($dirs)) :
sort($dirs);
foreach ($dirs as $nome):
if ($nome == ".." || $nome == ".") continue;
if ($row == 2) $row = 1; else $row = 2;
?>
<tr class="row<?php echo $row; ?>" onmouseover="over(this)">
<td align="center" width="55" height="20" class="extCell">[DIR]</td>
<td><a href="?pasta=<?php echo base64_encode("$pasta/$nome"); ?>"><?php echo $nome; ?></a></td>
<td>--</td>
<td> </td>
</tr>
<?php
endforeach;
endif;
?>
<?php
if (is_array($files)):
sort($files);
foreach ($files as $nome):
if (in_array(strtolower($nome),$denyFiles)) continue;
if ($row == 2) $row = 1; else $row = 2;
$tamanho = filesize("./$nome");
$info = pathinfo("./$nome");
?>
<tr class="row<?php echo $row; ?>" onmouseover="over(this)">
<td align="center" width="55" height="20" class="extCell">[<?php echo strtoupper($info["extension"]); ?>]</td>
<td><a href="?action=download&file=<?php echo base64_encode("$pasta/$nome"); ?>"><?php echo $nome; ?></a> </td>
<td><?php echo $tamanho > 1048576 ? round($tamanho/1048576,2)." Mb" : round($tamanho/1024,2)." Kb"; ?></td>
<td> </td>
</tr>
<?php
endforeach;
endif;
?>
</table>
<?php endif; ?>
</body>
</html>
<?php closedir($dir); ?>
____________________________________________________________________________________________
Minha dúvida: Quando efetuo o download de arquivos em Excel, ele corrompe. Sabe me dizer como resolvo isso? Tentei de tudo, mas não consegui solucionar.
Link para o comentário
Compartilhar em outros sites
12 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.