[PHP/MySQL] Grote bestanden opslaan in de database

Pagina: 1
Acties:
  • 180 views sinds 30-01-2008
  • Reageer

  • FoxzMan
  • Registratie: September 2000
  • Laatst online: 01-03 20:35
Voor mijn site ben ik bezig met PHP/MySQL.

Op mijn site wil ik een paar bestanden aanbieden. Ik heb ervoor gekozen om deze bestanden in de database op te slaan, zodat niet iedereen deze bestanden kan downloaden. Alleen geregistreerde users mogen deze bestanden downloaden.

Om deze bestanden op slaan in de MySQL database gebruik ik het volgende script:
PHP:
1
<?    session_start();    if ($Login == '*****') {// store.php3 - by Florian Dittmer <dittmer@gmx.net>// Example php script to demonstrate the storing of binary files into// an sql database. More information can be found at http://www.phpbuilder.com/?><HTML><HEAD>      <TITLE>Bestanden in de database opslaan</TITLE></HEAD><BODY><?php// code that will be executed if the form has been submitted:if ($submit) { include "config.inc.php";    $data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));    $result=MYSQL_QUERY("INSERT INTO binary_data (description,bin_data,filename,filesize,filetype) ".        "VALUES ('$form_description','$data','$form_data_name','$form_data_size','$form_data_type')");    $id= mysql_insert_id();    print "<p>Het geuploade bestand heeft de volgende ID: <b>$id</b><P><A HREF=\"admin.php\">Terug naar de beginpagina</A></P>";    MYSQL_CLOSE();} else {    // else show the form to submit new data:?>    <form method="post" action="upload.php" enctype="multipart/form-data">    beschrijving:<br>    <input type="text" name="form_description"  size="40">    <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="50000000">    <p>Bestand om in de database te zetten:<br>    <input type="file" name="form_data"  size="40">    <p><input type="submit" name="submit" value="submit">    </form><?php}?></BODY></HTML><?php     }     else { include "error.php"; }?>

Met dit script(heb ik van www.phpbuilder.com) lukt het mij om bestanden in de database te zetten. Echter bij grote bestanden van +20MB klapt het script eruit en wordt de pagina opnieuw geladen, er is dan niks in de database opgeslagen.
De kolom waar de BLOB-file is van het type LONGBLOB en zou dus in principe om moeten kunnen gaan met de grootte van deze bestanden.

Ik heb het PHP.INI-bestand aangepast, zodat het bestanden aankan tot 50MB (memory_limit, post_max_size en upload_max_filesize).
Ook MY.CNF heb ik aangepast (max_allowed_packet=50M).

Ik doe het nog allemaal in een test-omgeving op een NT4-bak met Apache 1.3.24, PHP 4.1.2 en MySQL 3.23.49.
Ik heb het helaas nog niet in een live-omgeving kunnen testen, omdat de live-omgeving nog niet is opgezet.

Kan PHP dan niet met bestanden omgaan groter dan 25MB of ligt het ergens aan MySQL.
Als dit niet kan, is er dan een manier om de bestanden veilig op te slaan op de webserver, zodat een niet-geregistreerde niet zomaar een bestand kan downloaden? Ik wil het niet met .htaccess doen, omdat ik de gebruikers wil laten inloggen via MySQL.

-


  • jvreuls
  • Registratie: Januari 2002
  • Laatst online: 31-07 13:13
Ik denk dat dit aan PHP ligt (stel je een string voor van 20+ MB).

Daarbij komt nog dat een database *absoluut* niet bedoeld is als file-opslagplaats, dit zal de snelheid echt geen goed doen. Kleine files gaan nog wel, maar 20+ MB lijkt me echt teveel.

Circuits Online


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Je kan natuurlijk vraagtekens zetten bij de geschiktheid van bestanden van die omvang in een SQL table met een HTTP upload...Daar is het allemaal niet echt voor bedoelt.

Overigens kan het zijn dat je maximum_execution_time overschreden wordt, probeer die dus ff in je php config te verhogen.

This can no longer be ignored.


  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Ik denk je er beter voor kan kiezen om via een PHP script een file te "streamen" naar een user. Dus een bestand wat je wil dat andere kunnen downloaden buiten je web-directory zetten en dan via een PHP script dit bestand openen en vervolgens doorsturen naar de user. Op die manier kun je toch de bescherming van de bestanden bieden en hoef je ze niet in de db op te slaan.

Signature van nature


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Op dinsdag 07 mei 2002 21:21 schreef Sircuri het volgende:
Ik denk je er beter voor kan kiezen om via een PHP script een file te "streamen" naar een user. Dus een bestand wat je wil dat andere kunnen downloaden buiten je web-directory zetten en dan via een PHP script dit bestand openen en vervolgens doorsturen naar de user. Op die manier kun je toch de bescherming van de bestanden bieden en hoef je ze niet in de db op te slaan.
Zie ook fpassthru() en readfile(). :)

Rustacean


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Niet alleen MySQL en PHP zorgen voor beperkingen. Ook je webserver software heeft vaak een maximum.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • FoxzMan
  • Registratie: September 2000
  • Laatst online: 01-03 20:35
Op dinsdag 07 mei 2002 22:39 schreef Janoz het volgende:
Niet alleen MySQL en PHP zorgen voor beperkingen. Ook je webserver software heeft vaak een maximum.
Kun je misschien iets specifieker zijn ? Bedoel je hiermee het volgende (httpd.conf):
code:
1
2
3
#Timeout: The number of seconds before receives and sends time out.
#
Timeout 900

-


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik zou sowieso niet zo gauw 20 MB+ bestanden in de db zetten.

Maak dan liever een tabel met verwijzingen naar lokale paden, die niet te bereiken zijn via de webserver. Maak vervolgens een php pagina die de bestand doorgeeft dmv. fpassthru naar de stdout (oftewel, de browser). Dan krijg je zo'n
http://www.sjaak.com/download.php?id=169
idee
id is het id in de database, daar staat waar het bestand lokaal opgeslagen is, vervolgens wordt dat bestand naar de browser gestuurd.

Tegelijk kun je dan in het download.php bestand nagaan of er juist is ingelogd. klaar is kees ;)

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

Pagina: 1