Visualizzazione risultati 1 fino 7 di 7

Discussione: memorizzare files nel database

  1. #1
    Guest

    Question memorizzare files nel database

    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..!

  2. #2
    Guest

    Predefinito

    il campo direi proprio binary([, 0-255])

    dimmi che errore ti viene rilasciato con mysql_error()?

  3. #3
    Guest

    Predefinito

    darksnake1992: quando creo la tabella in phpMyAdmin, seleziono binary (anzi, per la precisione varbinary) e imposto la lunghezza a 1 milione di bit (circa 8/10 megabyte, ma tanto sarà sicuramente meno visti gli scopi dello script..) e lui mi imposta in automatico il longblob..

    non avevo pensato al mysql_error() (si vede che non uso il php da un anno e passa..! ).. comunque l'errore che mi da' è questo:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '�-X�HH 8D ����]!d����9�=���ϳ�����׻|KYi��/+K����{�?�Msq���kZMgk���A' at line 2
    chiaro, no?
    Ultima modifica di tryphpnuke : 09-03-2009 alle ore 22.08.53 Motivo: ho sbagliato..

  4. #4
    Guest

    Predefinito

    io non ho detto byte, ma binary([, 0-255])

    comunque ti consiglio di stampare l'header dell'immagine in un file che non invii output...

    E comunque "line 2" non mi dice niente, posta la pagina precisa in cui ti sengnala l'errore, dato che in "uploads.php" alla linea 1-2 non ci sono errori.

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da darksnake1992 Visualizza messaggio
    io non ho detto byte, ma binary([, 0-255])
    scusa, ho sbagliato a scrivere, ma il concetto rimane lo stesso: se seleziono binary e imposto la lunghezza a 1 x 10^6 il campo si trasforma automaticamente in longblob.

    Citazione Originalmente inviato da darksnake1992 Visualizza messaggio
    comunque ti consiglio di stampare l'header dell'immagine in un file che non invii output...
    non ho capito.. stai parlando di quella stringa di caratteri incomprensibili? se sì (a parte che è un pdf, ma questo non era possibile capirlo, in effetti), quello è il messaggio di errore del mysql.

    Citazione Originalmente inviato da darksnake1992 Visualizza messaggio
    E comunque "line 2" non mi dice niente, posta la pagina precisa in cui ti sengnala l'errore, dato che in "uploads.php" alla linea 1-2 non ci sono errori.
    penso che "line 2" si riferisca alla query sql che passo dove c'è
    Codice PHP:
    $q = "INSERT INTO " . $db->pref . "_files (cat, name, mimetype, size, cont)
    VALUES ('
    {$fPath}', '{$fName}', '{$fType}', '{$fSize}', '{$fCont}')";
    quindi che l'errore stia proprio nel '{$fCont}', anche se non riesco a capire con esattezza dove..

    comunque, se vuoi un indirizzo dove andare a vedere coi tuoi occhi: area test

    [edit] ..e poi scusa, perché longblob non dovrebbe andare bene? è fatto apposta per contenere Binary Large OBjects..!
    Ultima modifica di tryphpnuke : 09-03-2009 alle ore 22.41.02

  6. #6
    Guest

    Predefinito

    Non ho fatto alcuna prova ma da quello che ho letto hai già capito che il problema è il contenuto.
    Mi sono soffermato su una parte del tuo codice:

    Codice PHP:
    ...
    $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); // ..
    proverei ad aggiungere un bel addslashes e ad aprire il file in "rb" e non solo in "r" in questo modo:

    Codice PHP:
    ...
    $fSize = $_FILES['nowFile']['size']; // File's size.
    $fTemp = $_FILES['nowFile']['tmp_name']; // Temporary File's path.

    $h = fopen($fTemp, "rb"); // File's content.
    $fCont = addslashes(fread($h, $fSize)); // ...
    Ciao

  7. #7
    Guest

    Predefinito

    funziona.

    grazie mille!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •