Ga naar inhoud
  • 0

Bestand downloaden vanuit containerveld


hbrendel

Vraag

10 antwoorden op deze vraag

Aanbevolen berichten

  • 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 naar reactie
  • 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 naar reactie
  • 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 naar reactie
  • 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 naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...