Jump to content
Fórum Script Brasil
  • 0

(Resolvido) PHP - Download corrompendo arquivos em XLS


binhofa
 Share

Question

Olá a todos.

Segue o código:

_______________________________________________________________________________________

<?php


/*

Script distribuído por brasilphp.net

Qualquer dúvida, escreva para [email protected]

Para criação e manutenção de scripts e sistemas, escreva para [email protected]

*/

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 to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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.

Edited by binhofa
Link to comment
Share on other 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?

Edited by binhofa
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.1k
    • Total Posts
      647.1k
×
×
  • Create New...