Beste PRGers.
Sinds een aantal weken ben ik aan het stoeien met Laravel (5.1). Ik ben voor een interne website een project aan het maken waarin collega's data kunnen opslaan (MySQL LONGBLOBS van ongeveer 16MB) en onze build server kan daarna deze data weer gebruiken bij het vullen van de deliverables.
De tabel is als volgt:
Ik kwam er bij het generen van het schema achter dat Laravel / Eloquent van zichzelf geen LONGBLOBs ondersteunt. Daarom moest ik de volgende regel toevoegen bij het aanmaken van de tabel:
[php]DB::statement("ALTER TABLE `blobstore` ADD `raw_data` LONGBLOB");[/php
Nu loop ik echter tegen een probleem aan. Wanneer ik de file download, kreeg ik maar 1MB (de eerste megabyte) van de LONGBLOB binnen.
Ik verdacht eerst de database, maar daarin staat de data wel volledig.

Een korte zoektocht leidde me naar: http://stackoverflow.com/...ownload-easily-in-laravel
Omdat ik geen files had, echo-de ik de content van de raw_data direct naar de outputbuffer:
Middels bovenstaande code kreeg ik ook maar files van 1MB binnen.
Mogelijk was de echo $blob->raw_data; het probleem, dus verving ik de code door een tempfile:
Wat schepte mijn verbazing; $writen stond op 1048576. Precies 1MB. Op dat moment begon ik Eloquent te verdenken, dus ik schreef zelf een query:
Echter hetzelfde resultaat.
Nu zit ik dus klem, wie kan mij in de juiste richting duwen?
Alvast bedankt
Matis
Sinds een aantal weken ben ik aan het stoeien met Laravel (5.1). Ik ben voor een interne website een project aan het maken waarin collega's data kunnen opslaan (MySQL LONGBLOBS van ongeveer 16MB) en onze build server kan daarna deze data weer gebruiken bij het vullen van de deliverables.
De tabel is als volgt:
Table: blobstore Columns: id int(10) UN AI PK version_id int(10) UN size int(10) UN description text created_at timestamp updated_at timestamp raw_data longblob
Ik kwam er bij het generen van het schema achter dat Laravel / Eloquent van zichzelf geen LONGBLOBs ondersteunt. Daarom moest ik de volgende regel toevoegen bij het aanmaken van de tabel:
[php]DB::statement("ALTER TABLE `blobstore` ADD `raw_data` LONGBLOB");[/php
Nu loop ik echter tegen een probleem aan. Wanneer ik de file download, kreeg ik maar 1MB (de eerste megabyte) van de LONGBLOB binnen.
Ik verdacht eerst de database, maar daarin staat de data wel volledig.

Een korte zoektocht leidde me naar: http://stackoverflow.com/...ownload-easily-in-laravel
Omdat ik geen files had, echo-de ik de content van de raw_data direct naar de outputbuffer:
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
| /* Versimpeld */ $blob = Blobstore::find($bid); $headers = array( 'Content-Description' => 'File Transfer', 'Content-Type' => 'application/octet-stream', 'Content-Transfer-Encoding' => 'binary', 'Expires' => 0, 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 'Pragma' => 'public', 'Content-Length' => $blob->size, ); $filename = 'foobar.bin'; $response = new Response('', 200, $headers); $response->header('Content-Disposition', 'attachment; filename=' . $filename); // If there's a session we should save it now if (Config::get('session.driver') !== '') { Session::save(); } session_write_close(); ob_end_clean(); $response->sendHeaders(); echo $blob->raw_data; // Finish off, like Laravel would Event::fire('laravel.done', array($response)); $response->foundation->finish(); exit; |
Middels bovenstaande code kreeg ik ook maar files van 1MB binnen.
Mogelijk was de echo $blob->raw_data; het probleem, dus verving ik de code door een tempfile:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $temp_file = tempnam(sys_get_temp_dir(), $filename); $fp = fopen($temp_file, "w+"); flock($fp, LOCK_EX); $writen = fwrite($fp, $blob->raw_data); flock($fp, LOCK_UN); fclose($fp); if ($fp = fread($temp_file, 'rb')) { while(!feof($fp) and (connection_status()==0)) { print(fread($fp, 8192)); flush(); } } unlink($temp_file); |
Wat schepte mijn verbazing; $writen stond op 1048576. Precies 1MB. Op dat moment begon ik Eloquent te verdenken, dus ik schreef zelf een query:
PHP:
1
2
3
4
| $raw_datas = DB::select('select `raw_data` from blobstore where id = ?', [$bid]); $raw_data = $raw_datas[0]; /* ... */ $writen = fwrite($fp, $raw_data->raw_data); |
Echter hetzelfde resultaat.
Nu zit ik dus klem, wie kan mij in de juiste richting duwen?
Alvast bedankt
Matis
[ Voor 7% gewijzigd door Matis op 11-08-2015 10:32 ]
If money talks then I'm a mime
If time is money then I'm out of time