To save a file to the database and then download it, you need to save the file mimetype, name, size, etc.
For this you need to create a table as follows
CREATE TABLE upload (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
type VARCHAR(30) NOT NULL,
size INT NOT NULL,
content MEDIUMBLOB NOT NULL,
PRIMARY KEY(id)
);
Type MEDIUMBLOB
up to 16 megabytes more or less, but there are the following types that should be used according to your needs.
- TINYBLOB
- BLOB
- MEDIUMBLOB
- LONGBLOB
To retrieve information from the file being uploaded, the global variable $_FILES
has the following information:
// O nome original do arquivo
$_FILES['userfile']['name'];
// O mimetype do arquivo. Esta informação é dada pelo browser do usuário.
// Por exemplo para uma imagem JPG seria "image/jpg"
$_FILES['userfile']['type'];
// O tamanho da imagem em bytes.
$_FILES['userfile']['size'];
// O nome do arquivo temporário criado quando o servidor recebe a
// requisição, e armazena para que o arquivo possa ser trabalhado.
$_FILES['userfile']['tmp_name'];
// O código de erro associado ao arquivo, caso houver.
$_FILES['userfile']['error'];
To write to the database just create the following script
save.php
$host = "localhost";
$username = "root";
$password = "";
$db = "sistema";
mysql_connect($host,$username,$password) or die("Impossível conectar com o banco de dados.");
mysql_select_db($db) or die("Não foi possível selecionar o banco de dados.");
if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) {
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
$query = "INSERT INTO upload (name, size, type, content ) VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
mysql_query($query) or die('Error, query failed');
}
mysql_close(); // Não esqueça de finalizar a conexão.
header("Location: listar.php");
exit(); // Sempre que quiser fazer algum redirecionamento, finalize o script para evitar erros no envio de cabeçalho.
Create a page to list the files for the user to click on the links and download.
listar.php
<?php
$host = "localhost";
$username = "root";
$password = "";
$db = "sistema";
mysql_connect($host,$username,$password) or die("Impossível conectar com o banco de dados.");
mysql_select_db($db) or die("Não foi possível selecionar o banco de dados.");
?>
<html>
<head>
<title>Arquivos</title>
</head>
<body>
<?php
$query = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if (mysql_num_rows($result) == 0) {
echo "Database is empty <br>";
} else {
while (list($id, $name) = mysql_fetch_array($result)) {
echo '<a href="download.php?id=' . $id . '">' . $name . '</a> <br>';
}
}
?>
</body>
</html>
<?php mysql_close() ?>
And the file to allow the file to be downloaded
download.php
<?php
if (isset($_GET['id'])) {
$host = "localhost";
$username = "root";
$password = "";
$db = "sistema";
mysql_connect($host,$username,$password) or die("Impossível conectar com o banco de dados.");
mysql_select_db($db) or die("Não foi possível selecionar o banco de dados.");
$id = (int) $_GET['id'];
$query = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
$result = mysql_query($query) or die('Error, query failed');
list($name, $type, $size, $content) = mysql_fetch_array($result);
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;
mysql_close();
exit();
}
This example is used to save files to the database, but you can save the actual image on the server and store in the database just the name of the image to download, so you would not need the download.php
file and your files would look like this:
save.php
The attached field in the database table now stores only the file name.
$host = "localhost";
$username = "root";
$password = "";
$db = "sistema";
mysql_connect($host,$username,$password) or die("Impossível conectar com o banco de dados.");
mysql_select_db($db) or die("Não foi possível selecionar o banco de dados.");
if (isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) {
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$pasta = __DIR__ . '/';
$nomeFinal = time().'.jpg';
if (move_uploaded_file($imagem['tmp_name'], $pasta . $nomeFinal)) {
$query = "INSERT INTO upload (anexo) VALUES ('$nomeFinal')";
mysql_query($query) or die('Error, query failed');
}
}
mysql_close(); // Não esqueça de finalizar a conexão.
header("Location: listar.php");
exit(); // Sempre que quiser fazer algum redirecionamento, finalize o script para evitar erros no envio de cabeçalho.
listar.php
<?php
$host = "localhost";
$username = "root";
$password = "";
$db = "sistema";
mysql_connect($host,$username,$password) or die("Impossível conectar com o banco de dados.");
mysql_select_db($db) or die("Não foi possível selecionar o banco de dados.");
?>
<html>
<head>
<title>Arquivos</title>
</head>
<body>
<?php
$query = "SELECT id, anexo FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if (mysql_num_rows($result) == 0) {
echo "Database is empty <br>";
} else {
while (list($id, $anexo) = mysql_fetch_array($result)) {
echo '<a href="caminho/da/pasta/' . $anexo . '" target="_blank">' . $anexo . '</a> <br>';
}
}
?>
</body>
</html>
<?php mysql_close() ?>