Mazatec 0 Denunciar post Postado Março 18, 2010 Fala galera... Sou iniciante aqui no fórum, e gostaria de compartilhar com vocês algo que demorei um bom tempo pra resolver. O meu problema era o seguinte: Tenho uma aplicação onde o usuário deve fazer upload de vários documentos no formato PDF. A condição era que esses arquivos fossem salvos no banco de dados, em formato binário. Para isso criei a tabela Documentos no meu banco de dados: CREATE TABLE `documentos` ( `id_documento` int(11) NOT NULL auto_increment, `nome_documento` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL, `descricao_documento` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `tamanho_documento` mediumint(9) NOT NULL, `dados_documento` mediumblob NOT NULL, PRIMARY KEY (`id_documento`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; Após a criação da tabela, criei o formluário de UPLOAD (upload.php) <html> <body> <form action="salvar.php" method="post" enctype="multipart/form-data"> <label>Descrição *</label><br> <input id="descricao_documento" name="descricao_documento" type="text" class="input" size="40" maxlength="100"/> <br> <label >Arquivo *</label><br> <input name="dados_documento" type="file" class="input" size="45"/> <br> <!--Enviar --> <input type="submit" value="Enviar" /> </form> </body> </html> Após isso, criei o arquivo responsável por salvar os dados no banco. (salvar.php) <?php $arquivo_temp = $_FILES["dados_documento"]["tmp_name"]; $nome_arquivo = $_FILES["dados_documento"]["name"]; $arquivo = isset($_FILES["dados_documento"]) ? $_FILES["dados_documento"] : FALSE; if($arquivo) { $fp = fopen($arquivo_temp,"rb"); $dados_documento = fread($fp,filesize($arquivo_temp)); fclose($fp); $descricao = $dados['descricao_documento']; $dados = bin2hex($dados_documento); $sql = "INSERT INTO documentos (nome_documento, descricao_documento, tamanho_documento, dados_documento) ". "VALUES ('$nome_arquivo', '$descricao', '$tamanho_documento', '$dados')"); mysql_select_db($database, $con); $result = mysql_query($sql, $con) or die(mysql_error()) } ?> Notem que antes de incluir os dados no BD, eu utilizei a função bin2hex, nativa do PHP $dados = bin2hex($dados_documento); Essa função converte dados em binário para hexadecimal. O motivo pelo qual tive de usar essa função, foi porque o código gerado por um arquivo PDF possui vários caracteres especiais como ' (aspas simples), etc. Antes de usar a bin2hex, tentei incluir o conteúdo do arquivo direto no banco, mas não consegui pois o MySql não aceita caracteres especiais em inserções. Resolvi utilizar a função addslashes, que retira esses caracteres, só que quando eu fazia o download do arquivo, ele estava vindo corrompido. Depois de um tempo descobri que eu não poderia retirar os caracteres especiais com addslashes porque acabava retirando informações do arquivo que comprometiam sua exibição. Após procurar muito, encontrei a função bin2hex que foi o que me salvou... Continuando, criei a interface para o download do arquivo. (listar_arquivos.php) <html> <head> <title>Baixar Arquivos MySQL</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php $query = "SELECT id_documento, nome_documento FROM documentos"; $result = mysql_query($query) or die('Erro, query falhou'); if(mysql_num_rows($result) > 0) { while(list($id, $nome) = mysql_fetch_array($result)) { <a href="download.php?id=<?php=$id;?>"><?php=$nome;?></a> <br> } } ?> </body> </html> Quando o link de download for clicado, o $_GET['id'] será setado. Isso é utilizado para saber qual arquivo selecionar no banco de dados. Abaixo está o código para abri a janela de download no browser: (download.php) <?php if(isset($_GET['id'])) { $id = $_GET['id']; $query = "SELECT nome_documento, tamanho_documento, dados_documento " . "FROM upload WHERE id_documento = '$id'"; $result = mysql_query($query) or die('Erro, query falhou'); list($nome_documento, $tamanho_documento, $dados_documento) = mysql_fetch_array($result); $nomeArquivo = $nome_documento; $file = fopen($nomeArquivo,"a+"); fwrite($file,hex2bin($dados_documento)); fclose($file); //Forçando o download... header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=" . $nomeArquivo); header("Content-Length: " . $doc->get('tamanho_documento')); header("Content-Transfer-Encoding: binary"); readfile($nomeArquivo); //Apagando o arquivo unlink($nomeArquivo); } function hex2bin($str) { $bin = ""; $i = 0; do { $bin .= chr(hexdec($str{$i}.$str{($i + 1)})); $i += 2; } while ($i < strlen($str)); return $bin; } ?> Na hora de fazer o download, tive que re-converter o arquivo novamente para binário, porém não existe função nativa do PHP que faça isso. Tive então de criar a função hex2bin que converte o arquivo que veio do banco de hexa para binário. Bom, vou ficando por aqui, espero que aproveitem o tópico.... Até mais pessoal Compartilhar este post Link para o post Compartilhar em outros sites
ozorio silva 0 Denunciar post Postado Março 18, 2010 cara porque tu não coloca os pdf numa pasta e o nome do pdf no banco assim para resgatar e só pegar o caminho da pasta e o nome do pdf no banco a forma que tu tá fazendo não é muito apropriada. depois tu faz um select e mostra os pdfs Compartilhar este post Link para o post Compartilhar em outros sites
Mazatec 0 Denunciar post Postado Março 18, 2010 cara porque tu não coloca os pdf numa pasta e o nome do pdf no banco assim para resgatar e só pegar o caminho da pasta e o nome do pdf no banco a forma que tu tá fazendo não é muito apropriada. depois tu faz um select e mostra os pdfs Por motivos de segurança e pela facilidade de acessar os arquivos... Como os arquivos que serão armazenados não são grandes, então não haverá problema de performance no bd. Salvando apenas o caminho no banco pode ocorrer do diretório ser excluído, e com isso surgir varios problemas. Além de ter que se preocupar com a segurança do diretório onde estão sendo salvos os arquivos. Mas se fossem arquivos grandes eu concordo que teria de fazer dessa maneira. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Março 18, 2010 @Mazatec, Vou ilustrar como gravar o arquivo na sua tabela utilizando PDO, caso tenha dúvida sobre o uso consulte a documentação em Book PDO, se após consultar o manual a dúvida persistir, poste-a aqui. salvar.php <?php if ( isset( $_FILES[ 'dados_documento' ] ) ){ $dbHost = 'localhost'; $dbUser = 'username'; $dbPswd = 'pass'; $dbName = 'database'; $upFile =& $_FILES[ 'dados_documento' ]; if ( is_file( $upFile[ 'tmp_name' ] ) && is_readable( $upFile[ 'tmp_name' ] ) ){ $upName = $upFile[ 'name' ]; $upDesc = 'Descrição do arquivo'; //De onde vem essa informação ??? $upSize = filesize( $upFile[ 'tmp_name' ] ); $upHndl = fopen( $upFile[ 'tmp_name' ] , 'rb' ); try { $pdo = new PDO( sprintf( 'mysql:host=%s;dbname=%s' , $dbHost , $dbName ) , $dbUser , $dbPass ); $pdo->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ); $stm = $pdo->prepare( 'INSERT INTO `documentos`(`nome_documento`,`descricao_documento`,`tamanho_documento`,`dados_documento` VALUES(:nome,:descricao,:tamanho,:dados );' ); $stm->bindParam( ':nome' , $upName , PDO::PARAM_STR ); $stm->bindParam( ':descricao' , $upDesc , PDO::PARAM_STR ); $stm->bindParam( ':tamanho' , $upSize , PDO::PARAM_INT ); $stm->bindParam( ':dados' , $upHndl , PDO::PARAM_LOB ); $execute = $stm->execute(); fclose( $upHndl ); if ( !$execute ){ throw new Exception( 'Não foi possível gravar o arquivo.' , $stm->errorCode() ); } } catch ( Exception $e ){ echo get_class( $e ) , '[ ' , $e->getCode() , ' ]: ' , $e->getMessage(); } } else { echo 'O arquivo não existe ou não temos permissões de leitura.'; } } else { echo 'O arquivo não foi enviado.'; } exibir.php $docId =& $_GET[ 'id' ]; $dbHost = 'localhost'; $dbUser = 'username'; $dbPswd = 'pass'; $dbName = 'database'; try { $pdo = new PDO( sprintf( 'mysql:host=%s;dbname=%s' , $dbHost , $dbName ) , $dbUser , $dbPass ); $pdo->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION ); $stm = $pdo->prepare( 'SELECT `d`.`nome_documento`,`d`.`tamanho_documento`,`d`.`dados_documento` FROM `documentos` AS `d` WHERE `d`.`id_documento`=:id;' ); $stm->bindParam( ':id' , $docId , PDO::PARAM_INT ); if ( $stm->execute() ){ if ( ( $obj = $stm->fetch( PDO::FETCH_OBJ ) ) !== false ){ header( sprintf( '%s 200 Ok' , $_SERVER[ 'SERVER_PROTOCOL' ] ) , 200 , true ); header( 'Content-type: application/pdf' ); header( sprintf( 'Content-Disposition: attachment; filename=%s' , $obj->nome_documento ) ); header( sprintf( 'Content-Length: %d' , $obj->tamanho_documento ) ); header( 'Content-Transfer-Encoding: binary' ); echo $obj->dados_documento; } else { header( sprintf( '%s 400 Bad Request' , $_SERVER[ 'SERVER_PROTOCOL' ] ) , 400 , true ); } } } catch ( Exception $e ){ echo get_class( $e ) , '[ ' , $e->getCode() , ' ]: ' , $e->getMessage(); } Compartilhar este post Link para o post Compartilhar em outros sites
fenixgroup 0 Denunciar post Postado Novembro 22, 2013 Bom dia! Tenho o seguinte código: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Listagem</title> <link rel="stylesheet" type="text/css" href="main.css" /> <script type="text/javascript"> function delRecord(id) { var teste = confirm("Tem certeza que quer excluir o registro?"); if (teste==false) { window.location = "listar_arquivos.php"; } else window.location = "delpdf.php?cod="+id; } </script> </head> <body> <table id="data"> <caption>Listagem</caption> <tr> <th>ID</th> <th>Arquivo</th> <th>Descricao</th> <th>Excluir</th> </tr> <?php # Conexão ao servidor MySQL # e seleção do banco Web21 include("conexao.php"); $sql="select * from tbl_pdf"; $query = mysql_query($sql); while ($linha = mysql_fetch_array($query)) { echo "<tr>"; echo "<td>$linha[id]</td>"; echo "<td>$linha[arquivo]</td>"; echo "<td style='text-align:center'>$linha[descricao]</td>"; echo "<td style='text-align:center'>"; echo "<a href='javascript:delRecord(".$linha['id'].");'>X</a>"; echo "</td>"; echo "</tr>\n"; } ?> </table> </body> </html> ---------------------------------------------------------------------------------------------------------- Gostaria de inserir um link nele para abrir o arquivo que se encontra em um diretório. O link serina nesta linha: echo "<td>$linha[arquivo]</td>"; O funcionamento é o seguinte, faço o Upload de um arquivo PDF e insiro sua descrição o arquivo é enviado para o diretório "/upload/pdf" e a descrição e o nome do arquivo para o banco de dados "tbl_pdf". Gostaria de gerar este link para que quando o usuário clicar no nome do arquivo o mesmo seja aberto. Desde já agradeço a atenção. Para melhor visualização o site é este: http://fenixweb.besaba.com/upload/pdf/listar_arquivos.php Compartilhar este post Link para o post Compartilhar em outros sites
fenixgroup 0 Denunciar post Postado Novembro 22, 2013 consegui resolver o problema segue o código: echo "<td align='center'>"; echo "<a href='$linha[arquivo]' target='blank'>$linha[arquivo]</a></td>"; Compartilhar este post Link para o post Compartilhar em outros sites