binhofa Posted May 19, 2015 Report Share Posted May 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. Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 19, 2015 Report Share Posted May 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... Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted May 19, 2015 Author Report Share Posted May 19, 2015 Não Stoma. Não tem nenhuma dessas informações. Abre criptografado (abri um xls no notepad). :( Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 19, 2015 Report Share Posted May 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; ?> Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted May 19, 2015 Author Report Share Posted May 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. Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 19, 2015 Report Share Posted May 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); Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted May 19, 2015 Author Report Share Posted May 19, 2015 (edited) 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. Edited May 19, 2015 by binhofa Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 19, 2015 Report Share Posted May 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 Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted May 20, 2015 Author Report Share Posted May 20, 2015 (edited) 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? Edited May 20, 2015 by binhofa Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 20, 2015 Report Share Posted May 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 Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted May 20, 2015 Author Report Share Posted May 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 Quote Link to comment Share on other sites More sharing options...
0 Stoma Posted May 21, 2015 Report Share Posted May 21, 2015 Finalmente! Que bom que deu certo :D A gente ajuda no que pode xD Abraço! Quote Link to comment Share on other sites More sharing options...
0 binhofa Posted December 22, 2015 Author Report Share Posted December 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. Quote Link to comment Share on other sites More sharing options...
Question
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 to comment
Share on other sites
12 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.