Jump to content
  • 0

Bestand downloaden vanuit containerveld


hbrendel

Question

10 answers to this question

Recommended Posts

  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...