2011-04-15 2 views
1

Je migre un site de IIS à GAE et j'essaie de batch upload a lot of images. Suite à ce défi particulier, j'en ai un qui me préoccupe davantage. Tout le contenu du site (stocké dans une base de données) référencent les images en tant que telles:Référencer Blobs dans GAE de manière intelligente

http://myurl.com/images/some-folder/maybe-another-folder/image-name.jpg

J'ai créé un gestionnaire simple Python pour servir les images:

class ServeBlobs(blobstore_handlers.BlobstoreDownloadHandler):  
    def get(self, resource):   
     query = "where filename='%s'" % resource   
     blobs = blobstore.BlobInfo.gql(query).fetch(1)   
     self.send_blob(blob_infos[0]) 

et les ' route 'est la suivante

('/images/(.*)', ServeBlobs) 

Cela fonctionne très bien et ne nécessite pas de table de correspondance séparée. Cependant, je suis sûr que la propriété filename de hte Blob ne peut pas contenir '/', alors que dois-je faire pour les dossiers (dont il y en a beaucoup) nommés some-folder ou maybe-another-folder dans l'exemple ci-dessus?

De plus, il y a presque certainement chevauchement dans les noms d'image dans différents dossiers, par ex.

"/images/foldera/main.jpg" 
and 
"/images/folderb/main.jpg" 

Des idées?

Répondre

2

Vous devez avoir le formulaire de téléchargement spécifier un chemin d'accès complet au fichier en tant que champ supplémentaire et soit ignorer le nom de fichier de téléchargement entièrement, soit l'ajouter au chemin fourni.

Ensuite, vous devez créer un modèle de magasin de données qui a un BlobReferenceProperty référençant le blob, avec le chemin complet comme nom de clé. De cette façon, vous pouvez rechercher une tâche blob via une simple banque de données au lieu d'une requête plus coûteuse, et vous pouvez également stocker toutes les informations pertinentes sur l'entité (telles que les informations d'en-tête, etc.).

1

Pas une réponse directe mais plus une recommandation:

S'il est possible à l'intérieur de votre application, je vous recommande d'essayer de migrer toutes vos images dynamiques à utiliser la méthode get_serving_url du blobstore. Plutôt que d'avoir un gestionnaire pour servir manuellement vos blobs. C'est un système beaucoup plus efficace pour servir les images et vous donne la possibilité d'accéder au redimensionnement intégré.

Cela nécessiterait que votre migration soit un peu plus compliquée, mais je crois beaucoup mieux à long terme.

  • Vous devrez POST chacun de vos images au blobstore comme vous le faites actuellement et récupérer le serving url pour le blob d'image
  • Gardez une carte locale de vos vieux-urls =>nouvelle portion -urls lors de la migration
  • mise à jour tous les vieux-urls à vos nouvelles pORTIONS-urls dans votre application/données

en fonction de la façon dont vous avez stocké tous vos liens vers des images dans votre version précédente de votre application, cela pourrait être trivial ou presque impossible, mais je pense que cela vaut la peine de garder à l'esprit.

Questions connexes