Externe social media bestanden lokaal opslaan in Drupal

22 Apr 2015

Thomas Dik - Lead Developer
+31 (0)20 - 261 14 99

In enkele projecten maken we gebruik van externe afbeeldingen en bestanden. Bijvoorbeeld bij sociale media integratie in een Drupal website. Maar wat nou als het social media bestand (b.v. een afbeelding van Facebook) die je in je Drupal pagina hebt verwerkt niet langer beschikbaar is op Facebook? Het zou zonde zijn om een missende afbeelding of file te laten zien.

Het is handig om de 'remote file' dan te kopiëren naar je Drupal installatie. Dit kanrelatief eenvoudig met behulp van twee Drupal functies, die betreffende bestanden kopiëren naar jouw Drupal installatie. Er zijn enkele onderdelen waar je rekening mee moet houden, bijvoorbeeld:

  • Check op extensies, welke typen ga je doorlaten?
  • Waar ga je de bestanden plaatsen?
  • Welke Drupal functies kan je gebruiken?

Check op extensies

Om informatie over bestanden te verkrijgen kan je de SplFileInfo class gebruiken. Voor de remote files gebruikten we maar een paar methodes: isFile en getExtension.

Het initialiseren van een SplFileInfo class is eenvoudig, geef het path naar de file mee:

    // Get the file information.  $file_info = new SplFileInfo($url);

Om te controleren of je daadwerkelijk een bestand hebt ingeladen kan je de isFile methode van SplFileInfo gebruiken. Daarna kan je testen of de extensie overeen komt met bestandstypen die je wilt doorlaten. Voor het voorbeeld nemen een lijst met afbeeldings typen welke we vergelijken met de extensie van het bestand. In code ziet dat er dan als volgt uit:

  $allowed_types = array('jpg','jpeg','png','gif');  // Check if we have a file.  if (!$file_info->isFile()) {    // Get the extension of the file.    $extension = $file_info->getExtension();    // Check if we have a file and it matches the allowed types.    if (!in_array($extension, $allowed_types)) {      return FALSE;    }  }

Plaatsen van het bestand

Zodra het bestand gevalideerd is moet het nog ergens terecht komen, een doel locatie. Het is aan te raden om gebruik te maken van het geconfigureerde bestandsschema binnen de Drupal installatie. Verder is het pad afhankelijk van de omgeving en de wensen van de gebruiker. Wij hebben gekozen voor een 'hash', zodat elk bestand een unieke naam krijgt:

  // Build hash of the file.  $hash = md5($url);  // Get the default schema for uploading.  $default_schema = file_default_scheme();  // Use hash for filename so the original can't be traced.  $cache_path = $default_schema . '://' . $hash . '.' . $extension;

Ophalen van extern bestand

Vervolgens gaan we het bestand ophalen van de externe locatie, dit kan gedaan worden met de drupal_http_request() functie. Om het opgehaalde bestand op te slaan gebruiken we de Drupal file_save_data() functie. Hier horen nog een paar checks bij, bijvoorbeeld: de status code die terug komt uit de drupal_http_request() functie mag geen foutmelding zijn.

 // Perform http request for fetching the file.  $result = drupal_http_request($url);  // Check if we have data or and error.  if (!empty($result->data) && $result->code == 200) {    $file = file_save_data($result->data, $cache_path);    // Attach file or do something else with it..  }  else {    // Throw exception..  }

Als alles goed verlopen is zit er in $file een object met de gegevens van het bestand zoals het ook zou krijgen naar een upload. Dit object kan je vervolgens aan een veld binnen je node hangen of ergens anders voor gebruiken.

Bron afbeelding

Comments

Nóg meer
kennis nodig?

Check ons ons blog archief >