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:
Ik heb verder een upload script waarmee ik files in de blob wegschrijf:
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:
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!
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 ;)