ho fatto questo programma, che permette l'upload di un file e il suo "spostamento" dentro il database, in modo tale da non dover fare seicento cartelle nello spazio web, ma solo una misera tabellina nell'mysql..
va be', comunque non è questo il punto. ecco il codice:
- uploads.php: (codice)
Codice PHP:
<?php
define("FQUFFIO", true); // Preliminary..
require_once("include.php"); // ..
header("Content-type: text/plain"); // Sets output type.
if ($_GET['act'] !== "ajax" || !isset($_POST['nowDir']) || !isset($_FILES['nowFile'])) // If no upload, errors.
die("You cannot access this file directly.");
$fPath = $_POST['nowDir']; // File's parent directory.
$fErr = $_FILES['nowFile']['error']; // Catches the error value (zero for everything OK).
$fName = basename($_FILES['nowFile']['name']); // File's name.
$fType = $_FILES['nowFile']['type']; // File's Mime-Type.
$fSize = $_FILES['nowFile']['size']; // File's size.
$fTemp = $_FILES['nowFile']['tmp_name']; // Temporary File's path.
$h = fopen($fTemp, "r"); // File's content.
$fCont = fread($h, $fSize); // ..
fclose($h); // ..
if ($fErr == 0) // No errors while uploading.
{
$q = "INSERT INTO " . $db->pref . "_files (cat, name, mimetype, size, cont)
VALUES ('{$fPath}', '{$fName}', '{$fType}', '{$fSize}', '{$fCont}')";
$r = $db->query($q); // Puts the file and its specifics into the database.
if ($r === false) // Outputs "false" if something went wrong, elsewhere it outputs "true"..
echo "false_query";
else
echo "true";
}
else // Errors in uploading.
echo "false_upload";
echo "|" . $fName;
?>- includes.php: contiene la classe MySQL (con tutti i metodi necessari ad operare sul database) e istanza l'oggetto $db (di tipo MySQL, il cui costruttore, tra l'altro, apre la connessione al server del database e sceglie il database interessante).
- tabelle del database:
Codice:-- -- Struttura della tabella `ajaxupl_categories` -- CREATE TABLE `ajaxupl_categories` ( `id` int(11) NOT NULL auto_increment COMMENT 'Id della categoria.', `parent` int(11) NOT NULL default '0' COMMENT 'Id della categoria madre. 0 (default) per nessuna c.m.', `name` text NOT NULL COMMENT 'Nome della categoria.', `desc` text NOT NULL COMMENT 'Descrizione della categoria.', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Categorie (cartelle) per l''organizzazione dei contenuti.' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Struttura della tabella `ajaxupl_files` -- CREATE TABLE `ajaxupl_files` ( `id` int(11) NOT NULL auto_increment COMMENT 'Id del file.', `cat` int(11) NOT NULL default '0' COMMENT 'Id della categoria di appartenenza.', `name` text NOT NULL COMMENT 'Nome del file (completo di estensione).', `mimetype` text NOT NULL COMMENT 'Mime-Type del file.', `size` bigint(20) NOT NULL default '0' COMMENT 'Dimensione in byte del file.', `cont` longblob NOT NULL COMMENT 'Contenuto del file.', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Files caricati.' AUTO_INCREMENT=1 ;
in esecuzione questo programma mi da' un errore con la query che dovrebbe inserire i dati e il contenuto del file dentro al database. il problema è proprio nel contenuto, tanto è vero che, non facendoglielo inserire (cioè "dando in pasto" alla query solo dati come il nome, la dimensione, il mimetype e la categoria), tutto funziona a meraviglia.
domanda: come faccio a archiviare un file binario e/o ascii in un database senza perdere i dati, come devo dichiarare il campo che conterrà i dati del file?
perché evidentemente longblob non va bene, o forse ho sbagliato io qualcosa nel codice php.. boh!
grazie per tutte le risposte..!