[PHP/MySQL] probleempje met blobs

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • enriqueeeee
  • Registratie: Oktober 2001
  • Laatst online: 28-07 09:37

enriqueeeee

vanila coke kicks ass

Topicstarter
php 5.1.6
mysql 5.0.22

Ik heb een probleem met het up/downloaden van files via mysql blobs, waarbij de files corrupt raken.

Tabel ziet er zo uit:

MySQL:
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `files` (
  `id` int(11) NOT NULL auto_increment,
  `filename` varchar(255) collate latin1_general_ci NOT NULL,
  `filesize` int(11) NOT NULL,
  `mimetype` varchar(255) collate latin1_general_ci NOT NULL,
  `filedata` mediumblob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;


Ik heb verder een upload script waarmee ik files in de blob wegschrijf:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$filename = $_FILES['filename']['name'];
$mimetype = $_FILES['filename']['type'];
$filesize = $_FILES['filename']['size'];
$temp_name = $_FILES['filename']['tmp_name'];

$filedata = addslashes(file_get_contents($_FILES['filename']['tmp_name']));

$sql = "INSERT INTO files (filename, filesize, mimetype, filedata) VALUES ('$filename', $filesize, '$mimetype', '$filedata')";
if (MySQL_Query($sql)) {
    .......
}


Niet zo spannend dus. Als ik een file upload en in mysql een select doe, dan zie ik ook een blob met de juiste size erin staan.

Daarnaast een download script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$id = $_GET['download'];
$sql = "SELECT * FROM files WHERE id = '$id'";
    
$result = MySQL_Query($sql);
    
if ($result) {
    if (MySQL_Num_Rows($result) == 1) {
        $row = MySQL_Fetch_Array($result);
            
        $mimetype = $row['mimetype'];
        $filename = $row['filename'];
        $filedata = $row['filedata'];
        $filesize = strlen($filedata);

        header("Content-length: $filesize");
        header("Content-type: $mimetype");
        header("Content-Disposition: attachment; filename=$filename");
        echo $filedata;
            
        exit();
    }
}


Ook niet al te spannend. Normaal gesproken moet dit gewoon werken, maar als ik een file op deze manier upload en daarna weer download, dan is de gedownloade file niet goed. Als ik bijvoorbeeld een jpg pak of een zipje, dan geven de programma's waarmee ik ze open een foutmelding dat het bestand beschadigd is etc.

Als ik nu een jpg upload en de inhoud met een text editor bekijk (heb zo even geen hex editor bij de hand) dan zie ik dat het begin van het bestand veranderd is, zie de volgende 2 printscreens:

Origineel
Upload en daarna download

Wat er precies gebeurd met die file weet ik niet... maar na het downloaden is de file corrupt. Ik weet niet 100% zeker of de file wel juist in MySQL terecht komt, maw of het aan php of mysql ligt.

Iemand die weet wat hier gaande is, of een idee heeft om daar achter te komen?

Alvast bedankt!

Phreak schopt kont, Grrrrrene ook ;)


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Vrij simpel te testen door het bestand een keer weg te schrijven naar een map en vervolgens het downloaden. Als ook dat mis gaat, ligt het in het uploaden.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Waarschijnlijk heb je ergens een beetje te veel whitespace ;) Een file met " <?php" erin, of juist "?> ".

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

En voeg even slashes toe bij u download script ;)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 20-09 18:24

TheBorg

Resistance is futile.

Alles mysql_real_escape_string en.

Acties:
  • 0 Henk 'm!

Verwijderd

Afgezien van waarom 't niet werkt: over 't algemeen is 't niet slim om bestanden in een blob in de database op te slaan. Het onderliggende OS heeft daar veel efficientere mogelijkheden voor (het file system)...

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
enriqueeeee schreef op zondag 30 maart 2008 @ 23:50:
Ik weet niet 100% zeker of de file wel juist in MySQL terecht komt, maw of het aan php of mysql ligt.
Dan vergelijk je strlen($row['filedata']) met $row['filesize'] en dan weet je of de lengte veranderd is tijdens de mysql acties. Eenvoudig debugwerk.

En schrijf aub de mysql_* functienamen gewoon compleet lowercase, zoals het hoort. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • enriqueeeee
  • Registratie: Oktober 2001
  • Laatst online: 28-07 09:37

enriqueeeee

vanila coke kicks ass

Topicstarter
Ok, vanalles geprobeerd.. maar wat ik ook deed.. file kwam dus niet goed door. File vanuit MySQL naar schijf gezet: werking OK.. dus er zat iets niet goed in de view.php zeg maar.

Heb nog geprobeerd met extra addslashes en base64 encoding, omdat ik dan iig zeker weet dat ik geen addslash teveel/teweinig heb.. maar niets hielp..

Tot... ik bij toeval de include voor de connectie gegevens opende.. en daar stond dus een tab voor de php tag 8)7 |:( |:(

Snap ik alleen nog niet helemaal waarom ik geen Headers allready sent error oid kreeg, maargoed.. probleem weer opgelost.

Phreak schopt kont, Grrrrrene ook ;)


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
enriqueeeee schreef op maandag 31 maart 2008 @ 18:34:
Snap ik alleen nog niet helemaal waarom ik geen Headers allready sent error oid kreeg, maargoed.. probleem weer opgelost.
Wellicht omdat je iets met output buffers doet? Zo ja, dan is je script een zooitje, want voor een download actie moet je niet al die andere troep uitvoeren. :P

edit:
Preventieve melding nav post hieronder: don't go there. Topics over fs vs db komen echt elke paar maanden terug en zijn doorgaans nog relatief lang en vervelend ook. :P

[ Voor 18% gewijzigd door Voutloos op 01-04-2008 08:08 ]

{signature}


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Verwijderd schreef op maandag 31 maart 2008 @ 01:24:
Afgezien van waarom 't niet werkt: over 't algemeen is 't niet slim om bestanden in een blob in de database op te slaan. Het onderliggende OS heeft daar veel efficientere mogelijkheden voor (het file system)...
offtopic:
Efficienter hangt nogal af van wat je er mee wil. Daarnaast is efficienter niet gelijk aan slimmer; als data-integriteit belangrijk is dan heb je veel meer aan een database dan aan een filesystem.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Voutloos schreef op maandag 31 maart 2008 @ 20:48:
[...]
Wellicht omdat je iets met output buffers doet? Zo ja, dan is je script een zooitje, want voor een download actie moet je niet al die andere troep uitvoeren. :P
Hmm... nee, dat is het niet. Ik heb een include voor de db connectie

PHP:
1
2
3
4
<?
$conn = mysql_connect etc
$db = mysql_select_db etc
?>


en die include ik op iedere page. Maar nu bleek daar aan het begin een tab te zitten, dus

PHP:
1
2
3
4
    <?
$conn = mysql_connect etc
$db = mysql_select_db etc
?>


maar even verderop wordt dus in die view.php de header geset voor content-length, filename etc, dus ik zou verwachten dattie daar een error op zou geven.

Nnway.. probleem is opgelost, verhaal van file op fs.. lekker kort door de bocht zonder de situatie te kennen :+ doet er maar een slotje op

edit:
lol.. kzie net pas dat ik thuis auto ingelogd ben onder een andere naam, namelijk van een maat van me..

[ Voor 6% gewijzigd door Mephix op 01-04-2008 08:18 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik snap dat je output hebt, jij snapt mij juist niet. ;) OB is een mogelijk verklaring waarom je geen headers sent error krijgt.

{signature}

Pagina: 1