2010-09-30 2 views
0

Je souhaite diffuser des images dans une application Web à l'aide de sessions telles que les liens vers les images expirent une fois la session expirée. Si je montre les liens réels vers le système de fichiers des images, disons http://www.mywebapp.com/images/foo1.jpg, cela rendra difficile l'arrêt des futures requêtes pour l'image (celle que l'utilisateur a déconnectée de la session). C'est pourquoi je pensais placer les images dans un sqlite db, et les servir à partir de là.Assurer une URL dynamique dans une application web: utiliser un magasin de blob?

Il semble que l'utilisation de la base de données pour le stockage d'image est considérée comme une mauvaise pratique (bien que apparemment le magasin de blob GAE semble fournir cette fonctionnalité), donc j'essayais de comprendre quelles seraient les alternatives.

1) Peut-être que je fais somesort de-re-écriture URL comme ceci:

http://www.mywebapp.com/images/[session_id]/foo1.jpg Pensant à l'aide nginx, mais il semble (sur un premier coup d'oeil) que cela exigera une Hackin accomplir?

2) Copiez les fichiers dans un répertoire physique sur le système de fichiers et supprimer lorsque la session expire. Cela semble plutôt désordonné?

Existe-t-il des méthodes standard pour accomplir cette chose url image dynamique? J'utilise web.py - si cela peut vous aider.

Merci beaucoup! Le mod_secdownload de

+0

Les images elles-mêmes sont-elles générées dynamiquement?Et quand vous dites 'session', est-il nécessaire pour le même utilisateur de télécharger la même image plusieurs fois? Ou serait-il acceptable d'expirer après chaque demande? – AndrewF

+0

Les images atm sont assez statiques - mais je veux que l'option soit capable de filigrane avec l'ID utilisateur à un moment donné. Je pense qu'il serait bon d'expirer après un accès unique, car je devrais être capable de générer à nouveau le lien si nécessaire, mais peut-être un délai d'attente pourrait être une meilleure solution? – malangi

Répondre

1

Pourquoi est-ce si compliqué?

Serve l'image sous le nom que l'utilisateur fourni (à savoir http://www.mywebapp.com/images/foo1.jpg)

Enregistrer les images dans un répertoire à l'aide d'une UUID comme nom.

Créer une carte de noms de fichiers pour UUIDs dans la session.

Dans le gestionnaire pour /images/ rechercher le vrai nom de fichier dans la carte. Renvoie 404 si aucune entrée n'existe. Sinon, servez l'image.

Lorsque la session est fermée, supprimez tous les fichiers de la carte.

Dans une tâche cron, supprimez toutes les images qui sont plus d'un jour.

De cette façon, plusieurs utilisateurs peuvent télécharger la même image (même nom), les images sont supprimées dès que possible ou par le travail cron (si le serveur tombe en panne ou quelque chose comme ça).

+0

woah. cela semble être une solution beaucoup plus élégante - question rapide re. la carte pour le gestionnaire cependant - devinant que ce serait quelque chose comme http://wiki.nginx.org/HttpMapModule? et je devrais générer la carte en python? – malangi

+0

Utilisez simplement un 'dict' clair. –

-1

Une combinaison de vos deux idées (copie à un répertoire, expire lorsque la session expire) pourrait être généralisé à créer un nouveau répertoire (peut être aussi simple qu'un lien symbolique) toutes les 15 minutes. Lors de la génération du nouveau lien symbolique, supprimez également celui qui date d'une heure. Toujours lier au nouveau nom dans votre code.

Questions connexes