diff --git a/Resources/config/services.yml b/Resources/config/services.yml
index 7ca45a9f828e6b44ba0c6a6cc9254f9d069424d9..770f4a8d4939e211a2991dd97c6ab9ea589a363a 100644
--- a/Resources/config/services.yml
+++ b/Resources/config/services.yml
@@ -71,5 +71,13 @@ services:
         class: Irstea\FileUploadBundle\Twig\FileUploadExtension
         arguments:
             - @translator
+            - @irstea_file_upload.url_generator
         tags:
             - { name: twig.extension }
+
+    # Générateur d'URL
+    irstea_file_upload.url_generator:
+        class: Irstea\FileUploadBundle\Service\FileUrlGenerator
+        arguments:
+            - @router
+            - @security.csrf.token_manager
diff --git a/Resources/views/Extension/uploaded_file.html.twig b/Resources/views/Extension/uploaded_file.html.twig
index 3b929a1f156a62fa8b1273dd52a44b0c0432cca6..17f5952a003ff6ba43c983bd3b090e40cb1973ae 100644
--- a/Resources/views/Extension/uploaded_file.html.twig
+++ b/Resources/views/Extension/uploaded_file.html.twig
@@ -2,14 +2,7 @@
     <span class="uploaded-file">
         {{- irstea_file_icon(file.type|default(null)) -}}
         &nbsp;<span class="name">
-            <a href="{{
-                path('file_upload_get_content', {
-                    'id': file.id|default('__id__'),
-                    'token': csrf_token(constant('Irstea\\FileUploadBundle\\Controller\\UploadController::CSRF_INTENTION'))
-                })
-            }}">
-            {{- file.name|default('') -}}
-            </a>
+            <a href="{{ irstea_file_url(file.id|default('__id__')) }}">{{ file.name|default('') }}</a>
         </span>&nbsp;(<span class="size">
             {{- file.size|default(0)|irstea_file_size -}}
         </span>)
diff --git a/Service/FileUrlGenerator.php b/Service/FileUrlGenerator.php
new file mode 100644
index 0000000000000000000000000000000000000000..16bc22af7a3a0c331f0ef1eb0fc8312f4fbf8054
--- /dev/null
+++ b/Service/FileUrlGenerator.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * Copyright (C) 2015 IRSTEA
+ * All rights reserved.
+ */
+
+namespace Irstea\FileUploadBundle\Service;
+
+use Irstea\FileUploadBundle\Controller\UploadController;
+use Irstea\FileUploadBundle\Model\UploadedFileInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
+
+/**
+ * Implémentation de FileUrlInterface utilisant les services de Symfony.
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+class FileUrlGenerator implements FileUrlGeneratorInterface
+{
+    /**
+     * @var UrlGeneratorInterface
+     */
+    protected $urlGenerator;
+
+    /**
+     * @var CsrfTokenManagerInterface
+     */
+    protected $tokenManager;
+
+    /**
+     * @param UrlGeneratorInterface $urlGenerator
+     * @param CsrfTokenManagerInterface $tokenManager
+     */
+    public function __construct(UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $tokenManager)
+    {
+        $this->urlGenerator = $urlGenerator;
+        $this->tokenManager = $tokenManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function generate($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
+    {
+        $token = $this->tokenManager->getToken(UploadController::CSRF_INTENTION);
+
+        $url = $this->urlGenerator->generate(
+            'file_upload_get_content',
+            ['id' => $idFile, 'token' => $token->getValue()],
+            $referenceType
+        );
+
+        return $url;
+    }
+}
diff --git a/Service/FileUrlGeneratorInterface.php b/Service/FileUrlGeneratorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..123941fca4af6a039efe244201992699838c5893
--- /dev/null
+++ b/Service/FileUrlGeneratorInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * Copyright (C) 2015 IRSTEA
+ * All rights reserved.
+ */
+
+namespace Irstea\FileUploadBundle\Service;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+/**
+ * Service générant/vérifiant une URL pour un fichier.
+ *
+ * @author Guillaume Perréal <guillaume.perreal@irstea.fr>
+ */
+interface FileUrlGeneratorInterface
+{
+    /**
+     * Génère une URL sécurisée pour un fichier.
+     *
+     * @param string $idFile Identifiant du fichier pour lequel générer l'URL.
+     * @param string|bool $referenceType Type d'URL à générer.
+     * @return string L'url générée.
+     */
+    public function generate($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH);
+}
diff --git a/Twig/FileUploadExtension.php b/Twig/FileUploadExtension.php
index 45d42ac1114487a96d04e50c38650e8e21342456..3b804bcdaca414b8dd3e9e0ac107b33494ac5ae0 100644
--- a/Twig/FileUploadExtension.php
+++ b/Twig/FileUploadExtension.php
@@ -10,9 +10,13 @@
 
 namespace Irstea\FileUploadBundle\Twig;
 
+use InvalidArgumentException;
+use Irstea\FileUploadBundle\Entity\UploadedFile;
 use Irstea\FileUploadBundle\Model\UploadedFileInterface;
+use Irstea\FileUploadBundle\Service\FileUrlGeneratorInterface;
 use Irstea\FileUploadBundle\Utils\MimeTypeIcon;
-use \NumberFormatter;
+use NumberFormatter;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use Symfony\Component\Translation\TranslatorInterface;
 use Twig_Environment;
 use Twig_Extension;
@@ -29,13 +33,19 @@ class FileUploadExtension extends Twig_Extension
      */
     private $translator;
 
+    /**
+     * @var FileUrlGeneratorInterface
+     */
+    private $urlGenerator;
+
     /**
      *
      * @param TranslatorInterface $translator
      */
-    public function __construct(TranslatorInterface $translator)
+    public function __construct(TranslatorInterface $translator, FileUrlGeneratorInterface $urlGenerator)
     {
         $this->translator = $translator;
+        $this->urlGenerator = $urlGenerator;
     }
 
     /**
@@ -52,6 +62,13 @@ class FileUploadExtension extends Twig_Extension
                     'is_safe' => ['html']
                 ]
             ),
+            new Twig_SimpleFunction(
+                'irstea_file_url',
+                [$this, 'generateFileUrl'],
+                [
+                    'is_safe' => ['html', 'html_attr']
+                ]
+            ),
             new Twig_SimpleFunction(
                 'irstea_file_icon',
                 [$this, 'formatFileIcon'],
@@ -97,15 +114,30 @@ class FileUploadExtension extends Twig_Extension
     {
         if(null === $file) {
             return '';
-        } elseif($file instanceof \Irstea\FileUploadBundle\Entity\UploadedFile) {
+        } elseif($file instanceof UploadedFile) {
             $file = $file->toArray();
         } elseif(!is_array($file)) {
-            throw new \InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null");
+            throw new InvalidArgumentException("irstea_uploaded_file expects an UploadedFile instance, array or null");
         }
 
         return $env->render('IrsteaFileUploadBundle:Extension:uploaded_file.html.twig', ['file' => $file]);
     }
 
+
+    /** Genère un URL sécurisée pour télécharger un fichier.
+     *
+     * Usage : `{{ irstea_file_path(file.id) }}`
+     *
+     * @param string $idFile
+     * @param string|bool $referenceType
+     *
+     * @return string
+     */
+    public function generateFileUrl($idFile, $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
+    {
+        return $this->urlGenerator->generate($idFile, $referenceType);
+    }
+
     /** Génère un tag "icône" Font-Awesome pour le type MIME indiqué.
      *
      * Usage : `{{ irstea_file_icon(mimeType) }}`