[PHP / MySQL] Download geupte plaatjes corrupt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Hallo mensen,

Ik ben bezig met een phpscriptje dat binaire bestanden in een BLOB-field kan zetten en deze vervolgens ook weer uit kan lezen.
Nu denk ik dat het uploaden wel succesvol lukt maar bij het uitlezen gaat het mis.
Als ik plaatjes uitlees dan krijg ik het beruchte rode kruisje en flashbestanden blijft hij oneindig laden. Hij ziet dus wel wat voor type bestand het is maar ergens in de bestandsinhoud gaat het fout.

Voor het uploaden gebruik ik ongv. het volgende script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?

if($_FILES[attach][tmp_name] != "none" && $_FILES[attach][tmp_name] != "") {
            
            $fp = @fopen($_FILES[attach][tmp_name],"r"); 
            if($fp){
                
                $attach_size = filesize($_FILES[attach][tmp_name]);
                $content = fread($fp,$attach_size); 
                fclose($fp);
                
                $max_attach = 1000000;

                if($attach_size > $max_attach) {
            
                    echo $header;
                    zeg($txt[attachtegroot],true);
                    echo $footer;
                    exit;
                }

                $db->query("INSERT INTO $table_bijlage VALUES('', '".$_FILES[attach][name]."','".$_FILES[attach][type]."','".$attach_size."','".addslashes($content)."')");

            } else { 
                
                echo $header;
                zeg("Error: Kan bestand niet openen",true);
                echo $footer;
                exit;
            }
        }

?>


De fileinput heet in het formulier 'attach'

Om het geheel weer te downloaden heb ik dit in elkaar geknutseld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?

$query = $db->query("SELECT * FROM bijlage WHERE id='$id'");
$file = $db->fetch_array($query);
$file[attachment] = stripslashes($file[attachment]);
header("Content-disposition: filename=$file[filename]");
header("Content-Length: ". strlen($file[attachment]));
header("Content-type: $file[filetype]");
header("Pragma: no-cache");
header("Expires: 0");
echo $file[attachment];

?>


De tabel 'bijlage' bevat een aantal velden waaronder:

id smallint(6)
filename varchar(120)
filetype varchar(120)
filesize int(40)
attachment blob

De blob wordt wel gevuld want als ik een bestand van +- 10kb in de database zet dan neemt de tabel ook ongeveer zoveel ruimte in beslag.

Ik heb al meerdere variaties op het bovenstaande geprobeerd en mijn instinct zegt mij dat het iets met het toevogen en verwijderen van slashes te maken heeft. Maargoed , dat kan ik natuurlijk ook gruwelijk mis hebben... :)

sorry voor layout-herindeling

Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens of je de mimetype wel goed ophaalt en wegschrijft(bij upload) en goed ophaalt en laat zien (bij download).
Mischien zit hier iets fout?

[editje]
Ik heb het ook niet zo op dingen als dit '$_FILES[attach][name]' in een query, maar kan persoonlijk zijn.

ik doe het altijd zo:
$filename = addslashes($_FILES[attach][name]);

en dan laat ik ipv $_FILES[attach][name] laat ik dit zien $filename.
Zo doe ik dat bij alles naar mysql toe(veiligheid hé ;) , is goed overdreven, maar je weet het maar nooit)

[ Voor 57% gewijzigd door Verwijderd op 04-12-2002 03:13 ]


Acties:
  • 0 Henk 'm!

Verwijderd

en ik doe het altijd weer zo:
PHP:
1
2
3
4
5
6
7
$im = imagecreatefromjpeg($file);
ob_start();
ImageJPEG ($im);
$pic = addslashes (ob_get_contents ());
ob_end_clean();
$qstr="INSERT INTO foto (FotoArtistIDFK, FotoThumb, FotoText, FotoData) 
              VALUES ($aid, '$smpic', '$ntext', '$pic')";

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 04 december 2002 @ 03:10:
Kijk eens of je de mimetype wel goed ophaalt en wegschrijft(bij upload) en goed ophaalt en laat zien (bij download).
Mischien zit hier iets fout?

[editje]
Ik heb het ook niet zo op dingen als dit '$_FILES[attach][name]' in een query, maar kan persoonlijk zijn.

ik doe het altijd zo:
$filename = addslashes($_FILES[attach][name]);

en dan laat ik ipv $_FILES[attach][name] laat ik dit zien $filename.
Zo doe ik dat bij alles naar mysql toe(veiligheid hé ;) , is goed overdreven, maar je weet het maar nooit)
Gebruik liever mysql_escape_string, die is beter geschikt. Daarnaast hoef je geen stipslashes meer te doen als het uit de DB komt. Dat doe je nu wel, en dat heeft tot gevolg dat je niet gegarandeerd hetzelfde bestand terugkrijgt.

Oefen trouwens eerst een met gewone tekstbestanden zonder contenttype. Dan kun je tenminste je foutmeldingen zien. (misschien is het wel gewoon een parse-error, maar zie je dat niet!)

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

offtopic:
ff topictitle gefix0red

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Even iets over je opzet:
Waarom zet je die bestanden in een blob-field en zet je ze niet gewoon normaal op schijf met een verwijzing ernaar in je db?
De voordelen daarvan:
1 Grootte van je database (blobfields maken de tabellen enorm (onnodig) groot
2 Blob fields zijn relatief traag (schrijven en lezen)

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

Verwijderd schreef op 04 december 2002 @ 10:32:
Even iets over je opzet:
Waarom zet je die bestanden in een blob-field en zet je ze niet gewoon normaal op schijf met een verwijzing ernaar in je db?
De voordelen daarvan:
1 Grootte van je database (blobfields maken de tabellen enorm (onnodig) groot
2 Blob fields zijn relatief traag (schrijven en lezen)
My words exacly!
Het is beter ieder systeem te laten doen waar het goed in is. Een (R)DBMS is goed in het efficient opslaan, ordenen en doorzoeken van kleine hoeveelheden data (varierend van 1 bytes tot ca 256 bytes). Een bestandssysteem is goed in het opslaan en terughalen van bestanden.

Waarom zeg je dat dan niet direct? Nou, deze reactie geef ik in iedere thread waarin bestanden in de DB worden gerost. Dit wordt niet altijd gewaardeerd.

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

kvdveer schreef op 04 december 2002 @ 10:48:
[...]


My words exacly!
Het is beter ieder systeem te laten doen waar het goed in is. Een (R)DBMS is goed in het efficient opslaan, ordenen en doorzoeken van kleine hoeveelheden data (varierend van 1 bytes tot ca 256 bytes). Een bestandssysteem is goed in het opslaan en terughalen van bestanden.

Waarom zeg je dat dan niet direct? Nou, deze reactie geef ik in iedere thread waarin bestanden in de DB worden gerost. Dit wordt niet altijd gewaardeerd.
Mee eens... maar aan de andere kant zou je mij ook afraden om een compleet databasebestand te bouwen en dan bijvoorbeeld de persoonsgegevens los in files op te slaan. Voordeel van in de database gooien is wel dat als je het record verwijderd je geen omkijken meer hebt of het plaatje wel is verwijderd /nog bestaat. En je hebt meer controle op de integriteit van re relatie record : plaatje. Er zal maar iemand perongeluk de map met plaatjes weghalen..

Maargoed... ik zou er zelf ook niet voor kiezen maar ik moest er laatst bij het verbouwen van een website aan denken omdat de hele structuur van de site er vanafhing dus werd ik gedwongen om het ook te doen.

offtopic:
Wazig verhaal...

Acties:
  • 0 Henk 'm!

  • Maxonic
  • Registratie: September 2000
  • Laatst online: 05-09 22:23
Oefen trouwens eerst een met gewone tekstbestanden zonder contenttype. Dan kun je tenminste je foutmeldingen zien. (misschien is het wel gewoon een parse-error, maar zie je dat niet!)
Hé, goeie tip. Er stond inderdaad nog een leuke PHP notice in de header. :)
Gebruik liever mysql_escape_string
Ok, dat heb ik nu en het werkt al beter. Plaatjes worden goed weergegeven, en flash bestanden ook. Echter als ik een zip-file up en download dan krijg ik bij het openen de melding: "Unexpected end of archive".
Even iets over je opzet:
Waarom zet je die bestanden in een blob-field en zet je ze niet gewoon normaal op schijf met een verwijzing ernaar in je db?
Ja, dat was ook een mogelijkheid maar zoals delta al zegt is het erg handig de informatie bij elkaar te houden. En op deze manier kan ik ook met programmatjes/script die van buiten de server af met de MySQL gast connecten bestanden uploaden en verwijderen terwijl ik daar anders weer een apparte FTP connectie voor op zou moeten zetten. De traagheid zal ook niet veel uitmaken gezien de bestanden niet constant gedownload hoeven te worden slechts enkele keren wanneer er appart om gevraagd wordt.

Bedank voor de tips, en mocht iemand nog weten waarom het einde van een file corrupt is, ik hoor het graag.

Zou het kunnen komen doordat Content-Length: niet de juiste grootte geeft. of is dat slechts om een indicatie bij het downloaden te geven?
Pagina: 1