Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) PHP - Download corrompendo arquivos em XLS


binhofa

Pergunta

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">&nbsp;</td>

<td width="204">Nome</td>

<td width="130">Tamanho</td>

<td width="316">A&ccedil;&otilde;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>&nbsp;</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>&nbsp;</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>&nbsp;</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.
Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

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;
?>
Link para o comentário
Compartilhar em outros sites

  • 0

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"])
{
}
?>
<?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.
Link para o comentário
Compartilhar em outros sites

  • 0

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 por binhofa
Link para o comentário
Compartilhar em outros sites

  • 0

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 por binhofa
Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...