hbrendel Posted September 24, 2007 Share Posted September 24, 2007 Is er iemand die dit al voor elkaar heeft gekregen in PHP? TIA Henk Quote Link to comment
0 Pieter Claerhout Posted September 26, 2007 Share Posted September 26, 2007 Je kan dit als volgt doen: <?php // Include de filemaker api require_once 'FileMaker.php'; // Maak een connectie met FileMaker $fm = & new FileMaker(); $fm->setProperty('database', 'ContainerTest'); $fm->setProperty('username', 'Admin'); $fm->setProperty('password', 'Admin'); // Zoek het record $command = $fm->newFindCommand('ContainerTest'); $command->addFindCriterion('title', 'foto 2'); $result = $command->execute(); $record = $result->getFirstRecord(); // Vraag FileMaker naar de url van het container veld $containerUrl = $record->getField('picture'); // Stuur de juiste content-type header header('Content-type: image/jpeg'); // Toon de container data echo $fm->getContainerData($containerUrl); ?> De truuk is dat de getField functie van een containerveld een url teruggeeft in de vorm van: /fmi/xml/cnt/data.cnt?-db=ContainerTest&-lay=ContainerTest&-recid=2&-field=picture(1) De extensie van "/fmi/xml/cnt/data.cnt" wordt aangepast aan de inhoud van het container veld. De volgende combinaties zijn mogelijk: JPEG beeld: /fmi/xml/cnt/data.jpg?-db=ContainerTest&-lay=ContainerTest&-recid=2&-field=picture(1) GIF beeld: /fmi/xml/cnt/data.gif?-db=ContainerTest&-lay=ContainerTest&-recid=2&-field=picture(1) Al de rest: /fmi/xml/cnt/data.cnt?-db=ContainerTest&-lay=ContainerTest&-recid=2&-field=picture(1) De functie getContainerData kan aan de hand van deze url dan de container data halen uit FileMaker. Let wel op als je de url wil doorgeven via de querystring, want dan mag je niet vergeten ze te urlencoden: Het img.php script kan er dan als volgt uitzien: <?php // Include de filemaker api require_once 'FileMaker.php'; // Maak een connectie met FileMaker $fm = & new FileMaker(); $fm->setProperty('database', 'ContainerTest'); $fm->setProperty('username', 'Admin'); $fm->setProperty('password', 'Admin'); // Controleer dat een url is meegegeven via de query string if (isset($_GET['-url'])){ // Stop the url in een variable $url = $_GET['-url']; // Zoek de extensie van het bestand $url = substr($url, 0, strpos($url, "?")); $url = substr($url, strrpos($url, ".") + 1); // Stuur de juiste header if($url == "jpg"){ header('Content-type: image/jpeg'); } else if($url == "gif"){ header('Content-type: image/gif'); } else{ header('Content-type: application/octet-stream'); } // Toon de inhoude van het containerveld echo $fm->getContainerData($_GET['-url']); } ?> Groeten, pieter Quote Link to comment
0 hbrendel Posted September 26, 2007 Author Share Posted September 26, 2007 Pieter, heel erg bedankt voor de uitgebreide beschrijving, ik ga er even naar kijken. Henk Quote Link to comment
0 hbrendel Posted September 26, 2007 Author Share Posted September 26, 2007 Wat ik tot nu toe niet deed was het verzenden van een header. Dit heb ik ingevoegd, maar nu krijg ik: Warning: Cannot modify header information - headers already sent by (output started at /Library/WebServer/Documents/database/file.php:101) in /Library/WebServer/Documents/database/file.php on line 118 In het bestand file.php komt echter geen andere aanroep van de functie 'header' voor. Ik ga eens proberen de download vanuit een nieuwe php-file te laten gebeuren. Let wel: het gaat mij specifiek om het plaatsen van een link naar een bestand ter downloading. Henk Quote Link to comment
0 Pieter Claerhout Posted September 26, 2007 Share Posted September 26, 2007 Henk, wat staat er op lijn 110 van file.php? Staat daar toevallig een lege lijn of een echo statement? pieter Quote Link to comment
0 hbrendel Posted September 26, 2007 Author Share Posted September 26, 2007 Het is (na een aantal http-errors 200) toch gelukt. Ik roep nu een nieuw bestand aan: download.php. Daarin wordt de url gemaakt en een getContainerData () aangeroepen. Het werkt! Nu heeft de gedownloade pdf altijd de naam 'download.php.pdf', en de volgende 'download-1.php.pdf', enz. Hoe kan ik er nu voor zorgen dat deze pdf's de naam hebben van het oorspronkelijke bestand, desnoods een on-the-fly te genereren naam? TIA Henk Quote Link to comment
0 hbrendel Posted September 26, 2007 Author Share Posted September 26, 2007 wat staat er op lijn 110 van file.php? Staat daar toevallig een lege lijn of een echo statement? Nee, maar er is al sprake van output, voordat de link wordt gegenereerd. Deze link(s) komen uit / staan in portaaldata. Vandaar een nieuwe file, en dat werkt dus wel. Bedankt, Henk Quote Link to comment
0 Pieter Claerhout Posted September 26, 2007 Share Posted September 26, 2007 De naam van het bestand in het container veld kan je helaas niet achterhalen met de FileMaker PHP API. Wat je wel kan doen is de naam genereren op basis van de waarde van een veld en dan de volgende code gebruiken: header( 'Content-Type: application/force-download; name="' . $name . '"'); header( 'Content-Disposition: attachment; filename="' . $name . '"'); header( 'Cache-Control: public' ); header( 'Content-Transfer-Encoding: binary' ); header( 'Content-length: ' . strlen($data) ); echo($data); Dit forceert de browser om de file te downloaden met de naam die je aangeeft in de headers. Groeten, pieter Quote Link to comment
0 hbrendel Posted September 27, 2007 Author Share Posted September 27, 2007 Ik heb dit geprobeerd, maar na al deze headers doet geen enkele link het meer op mijn site. Moeten die headers niet 'gereset' worden, o.i.d.? Weet je zeker dat dit zo klopt? Ik moet nog een paar tests doen, maar ik heb pas zaterdag weer tijd. Dan kom ik erop terug. In ieder geval erg bedankt, Pieter. Henk Quote Link to comment
0 hbrendel Posted September 27, 2007 Author Share Posted September 27, 2007 Dat de links het niet meer deden kwam door een domme typfout. Alles is nu in orde en het werkt precies zoals ik het wil. Pieter, waar heb je die PHP-kennis opgedaan? Henk Quote Link to comment
0 Pieter Claerhout Posted September 28, 2007 Share Posted September 28, 2007 Voornamelijk zelfstudie en heel veel lezen op internet... pieter Quote Link to comment
Question
hbrendel
Is er iemand die dit al voor elkaar heeft gekregen in PHP?
TIA
Henk
Link to comment
10 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.