Salvar BLOB de MYSQL 1 - pelo navegador de quem solicitou 2 - Salvar no servidor msmo (ja fiz de tudo.. revirei material e nada..)
05/12/2012
0
tabela arquivos
q dentro tem id (primary key) , nome (nome do arquivo), titulo (breve descricao do arquivo), conteudo (mediumblob), tipo (estou gravando text/plain)..
CREATE TABLE arquivos(
id int not null auto_increment primary key,
nome varchar(50),
titulo varchar(50),
conteudo mediumblob,
tipo varchar(50));
o q preciso na vdd sao 2 situacoes diferentes
1 - listar (feito sem problemas) e clicar link p download via browser do arquivo so isso, sendo q o conteudo do arquivo é pego do campo conteudo, e o nome do campo nome.. tudo q foi manual e tutorial revirado .. mais nao vai nem a pau.. inserir na tabela foi uma belezinha.. ate se alguem quiser.. segue um link no final do topico (funciona o insert download nao)
2 - qdo clicar.. da mesma forma.. mandar salvar diretamente no servidor dentro de uma pasta em especifico (NO SERVIDOR)... p q depois por exemplo pegue esse arquivo (q ja tem o nome) e envie por e-mail por exemplo (no caso de um PDF)
[url]http://www.oficinadanet.com.br/artigo/1599/manipulacao_de_dados_blob_com_php_e_mysql[/url]
Andre Ucella
Posts
05/12/2012
Eduardo Oliveira
05/12/2012
Andre Ucella
a primeira.. precisava salvar o arquivo no micro q esta acessando pelo navegador..
e
a outra situacao q é outro php. q nao tem nada a ver com a primeira.. salvar o arquivo lendo conteudo tbem .. so q ao inves de baixar.. é p salvar no servidor mesmo .. entendeu? tipo quero salvar na pasta do servidor /pdf
q qdo chamar por http://192.168.0.200/pdf ta la o arquivo
vc tem msn ou skype por favor.. p te explicar melhor?
05/12/2012
Andre Ucella
a primeira.. precisava salvar o arquivo no micro q esta acessando pelo navegador..
e
a outra situacao q é outro php. q nao tem nada a ver com a primeira.. salvar o arquivo lendo conteudo tbem .. so q ao inves de baixar.. é p salvar no servidor mesmo .. entendeu? tipo quero salvar na pasta do servidor /pdf
q qdo chamar por http://192.168.0.200/pdf ta la o arquivo
vc tem msn ou skype por favor.. p te explicar melhor?
05/12/2012
Eduardo Oliveira
A única forma de você salvar o arquivo na máquina de quem está acessando pelo navegador que no caso seria o seu client, é permitindo a ele fazer o download, não tem como pelo menos até onde eu saiba você enviar coisas pra máquina do cliente sem que ele queira, mesmo que tenha não acredito ser uma boa prática.
A melhor forma de você fazer, si foi que eu entendi sua dúvida, é trabalhe com upload esse arquivo vai para em uma pasta qualquer dentro do servidor onde teu site está hospedado, veja no manual
http://php.net/manual/pt_BR/features.file-upload.post-method.php
Posteriormente, você pode criar um link pra esses arquivos que você faz o upload e disponibiliza-lo pra quem desejar baixar.
Qualquer dúvida vai postando a e :)
É interessante mantermos essa " discussão " para que outras pessoas com problemas parecidos senão iguais possam utiliza-la.
05/12/2012
Andre Ucella
rs
vamos uma coisa por vez..
quero salvar o arquivo na maquina q estou ..
vamos esquecer o UPLOAD
os dados ja estou na tabela.. vamos partir desse principio..
pode ser??
05/12/2012
Andre Ucella
rs
rs
vamos uma coisa por vez..
quero salvar o arquivo na maquina q estou ..
vamos esquecer o UPLOAD
os dados ja estou na tabela.. vamos partir desse principio..
pode ser??
05/12/2012
Eduardo Oliveira
05/12/2012
Andre Ucella
entendeu?
tipo no banco.. tenho o arquivo... q tem o nome teste.txt e com conteudo BLOB
ok?
isso no banco mysql .. entendeu???
ai eu acesso via navegador..e salvo o arquivo..
segue php q ta quase.. so q o conteudo do arquivo vem so q tem com as tags de HTML. q nao deveria..
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}
$colname_Recordset1 = "-1";
if (isset($_GET['id'])) {
$colname_Recordset1 = $_GET['id'];
}
mysql_select_db($database_repositorio, $repositorio);
$query_Recordset1 = sprintf("SELECT id, nome, titulo, conteudo, tipo FROM arquivos WHERE id = %s ORDER BY id ASC", GetSQLValueString($colname_Recordset1, "int"));
$Recordset1 = mysql_query($query_Recordset1, $repositorio) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
$res = mysql_query($query_Recordset1);
$tipo = mysql_result($res, 0, "tipo");
$nome = mysql_result($res, 0, "nome");
$conteudo = mysql_result($res, 0, "conteudo");
header("Content-type: $tipo");
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$nome.'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($nome));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');
print $conteudo;
?>
----- ele ate salva.. so q vem com com o nome tudo certo.. conteudo ok..
so q no arquivo .. era p estar so
teste de conteudo.. de texto..
e vem
<br />
<font size='1'><table class='xdebug-error xe-warning' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Warning: filesize(): stat failed for teste.txt in C:\xampp\htdocs\WebNfeStorage\download\baixar_arquivo.php on line <i>53</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0016</td><td bgcolor='#eeeeec' align='right'>147168</td><td bgcolor='#eeeeec'>( )</td><td title='C:\xampp\htdocs\WebNfeStorage\download\baixar_arquivo.php' bgcolor='#eeeeec'>..\baixar_arquivo.php<b>:</b>0</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.1944</td><td bgcolor='#eeeeec' align='right'>152232</td><td bgcolor='#eeeeec'><a href='http://www.php.net/filesize' target='_new'>filesize</a>
( )</td><td title='C:\xampp\htdocs\download\baixar_arquivo.php' bgcolor='#eeeeec'>..\baixar_arquivo.php<b>:</b>53</td></tr>
</table></font>
teste de conteudo.. de texto..
<!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=utf-8" />
<title>Documento sem título</title>
</head>
<body>
<p> </p>
<p> </p>
<p> </p>
</body>
</html>
06/12/2012
Andre Ucella
porem o problema.. é q mesmo q eu baixe o conteudo (mesmo q o arquivo nao exista), ele sempre acrescenta o conteudo denovo..
exemplo .. .
o arquivo é o teste.txt , de conteudo.. q possui so uma linha de conteudo.
teste de conteudo.. de texto..
so q se eu rodar 10 vezes. ele insere 10 vezes a linha.. .uma embaixo da outra.. e o mais interessante.. mesmo q entre as vezes... eu apague o arquivo.. ele cria o arquivo incrementado... de uma linha
é mole
mysql_select_db($database_repositorio, $repositorio);
$query_Recordset1 = sprintf("SELECT id, nome, titulo, conteudo, tipo FROM arquivos WHERE id = %s ORDER BY id ASC", GetSQLValueString($colname_Recordset1, "int"));
$Recordset1 = mysql_query($query_Recordset1, $repositorio) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
$res = mysql_query($query_Recordset1);
$tipo = mysql_result($res, 0, "tipo");
$nome = mysql_result($res, 0, "nome");
$conteudo = mysql_result($res, 0, "conteudo");
//Agora atribuímos tudo para uma variável só.
$documento = $conteudo;
//Aqui você coloca o nome do arquivo que será gravado
$arquivo = $nome;
//Abrimos o arquivo que será gravado.
$abrir = fopen($arquivo, "a");
//Gravamos no arquivo
$gravar = fwrite($abrir, $documento);
//Testa se foi gravado
if($gravar){
echo"Gravados com sucesso!";
fclose($abrir);
unset($conteudo,$abrir, $gravar, $diretoriodestino);
}else{
echo"Não gravado!";
}
06/12/2012
Felipe Ribeiro
Qualquer dúvida estamos aí..
arquivo.php
<?php header('Content-type: text/plain'); header('Content-Disposition: attachment; filename="teste.txt"'); echo "testando download..."; ?>
06/12/2012
Eduardo Oliveira
http://www.oficinadanet.com.br/artigo/1599/manipulacao_de_dados_blob_com_php_e_mysql
Mas me diga tem realmente a necessidade de armazenar o arquivo em banco ??? Uma solução alternativa, claro dependendo do teu problema que não o conheço em sua essência seria...
No banco você pode guardar todas informações referentes aos arquivos, nome, tipo, tamanho, e ter um campo chamado caminho onde a partir desse caminho e do campo nome, você montas as opções de listagens para download, etc.
06/12/2012
Andre Ucella
entao preciso sim .. pois sao arquivos q sao exigidos pelo FISCO...
rs..
entende.. nao pode ser simplesmente arquivos... dentro do banco a integridade é melhor.. resolvido.. o problema..
segue..
pode finalizar... q esta perfeito as duas situacoes...
1 - baixa via browser (primeiro salvo no servidor.. e pego do servidor e transfiro usando os HEADER da vida...
$res = mysql_query($query_baixar_arquivo);
$tipo = mysql_result($res, 0, "tipo");
$nome = mysql_result($res, 0, "nome_xml");
$conteudo = mysql_result($res, 0, "xml");
$dirnome = '../tmp/'.$nome;
//Agora atribuímos tudo para uma variável só.
$documento = $conteudo;
//Aqui você coloca o nome do arquivo que será gravado
//$arquivo = $nome;
$arquivo = $dirnome;
//Abrimos o arquivo que será gravado.
$abrir = fopen($arquivo, "w");
//Gravamos no arquivo
$gravar = fwrite($abrir, $documento);
//Testa se foi gravado
//if($gravar){
//echo"Gravados com sucesso!";
fclose($abrir);
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="' . $dirnome . '"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($dirnome));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');
readfile($dirnome)
2 - salvar o arquivo em caminho absoluto exemplo no c:\arquivos no servidor
$res = mysql_query($query_baixar_arquivo);
$tipo = mysql_result($res, 0, "tipo");
$nome = mysql_result($res, 0, "nome_xml");
$conteudo = mysql_result($res, 0, "xml");
$dirnome = '../tmp/'.$nome;
//Agora atribuímos tudo para uma variável só.
$documento = $conteudo;
//Aqui você coloca o nome do arquivo que será gravado
//$arquivo = $nome;
$arquivo = $dirnome;
//Abrimos o arquivo que será gravado.
$abrir = fopen($arquivo, "w");
//Gravamos no arquivo
$gravar = fwrite($abrir, $documento);
//Testa se foi gravado
//if($gravar){
//echo"Gravados com sucesso!";
fclose($abrir);
07/12/2012
Eduardo Oliveira
Clique aqui para fazer login e interagir na Comunidade :)