Gå til innhold

Problemer med binære filer i database


Anbefalte innlegg

Driver å lager et lite filarkiv og sliter med den delen som står for lagring og utsending av filene, tenkte jeg skulle lagre filene i en MySQL-database, men har fått et problem da....

 

Her er klassen som håndterer lagringen og sendingen av filene:

<?php

class Filearchive_Storageengine_DB
{
/**
* mysqli object
*/
public $db = false;

public $table = 'filearchive_saved_files';

public function __construct($db = false)
{
 $this->db = $db ? $db : CMS::$db;
}

public function save_file($filecontent, $mimetype, $filename, $code = 0)
{
 $sql = sprintf("REPLACE INTO %s (`id`, `filedata`, `mimetype`, `filename`) VALUES ('%s', '%s', '%s', '%s')",
   $this->table,
   $code,
   $this->db->real_escape_string($filecontent),
   $this->db->real_escape_string($mimetype),
   $this->db->real_escape_string($filename));
 $res = $this->db->query($sql);
 if(!$res) {
 	CMS::make_error('Query failed: ' . $this->db->error, E_DBERROR, __FILE__, __LINE__, NULL, $sql);
 	return false;
 }
 return $this->db->insert_id;
}

public function send_file_to_user($code)
{
 $data = $this->get_filedata($code);
 header('Content-Length: ' . strlen($data[0]));
 header('Content-Type: ' . $data[1]);
 header('Content-Disposition: attachment; filename="' . $data[2] . '"');
 echo $data[0];
 die();
}

public function get_filedata($code)
{
 $sql = sprintf("SELECT `filedata`, `mimetype`, `filename` FROM %s WHERE `id` = '%d'", $this->table, $code);
 $res = $this->db->query($sql);
 if(!$res) {
 	CMS::make_error('Query failed: ' . $this->db->error, E_DBERROR, __FILE__, __LINE__, NULL, $sql);
 	return false;
 } elseif(!$data = $res->fetch_row()) {
 	return false;
 }
 return array(stripslashes($data[0]), stripslashes($data[1]), stripslashes($data[2]));
}

public function delete_file($code)
{
 $sql = sprintf("DELETE FROM %s WHERE `code` = '%s' LIMIT 1", $this->table, $code);
 $res = $this->db->query($sql);
 if(!$res) {
 	CMS::make_error('Query failed: ' . $this->db->error, E_DBERROR, __FILE__, __LINE__, NULL, $sql);
 	return false;
 }
 return true;
}
} 

 

Problemet er at at filene blir korrupte på en eller annen måte, lagrer jeg en odt-fil og laster ned og åpner i OpenOffice.org så får eg beskjed om at fila er ødelagt.

Prøver jeg med png-fil og laster og åpner i et bildevisningsprogram kommer det ingenting.

 

Her er strukturen på tabellen:

CREATE TABLE `filearchive_saved_files` (
 `id` int(11) NOT NULL auto_increment,
 `filedata` mediumblob NOT NULL,
 `mimetype` varchar(30) NOT NULL,
 `filename` varchar(255) NOT NULL,
 `last_changed` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
 `date_added` datetime NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...