以智能方式在GAE中引用Blob

时间:2011-04-15 02:51:44

标签: python image google-app-engine blobstore

我正在将网站从IIS迁移到GAE,我正在尝试batch upload a lot of images。除了那个特殊的挑战,我还有一个让我更关心的问题。网站的所有内容(存储在数据库中)都会引用图像:

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

我在Python中创建了一个简单的处理程序来提供图像:

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])

和'route'如下

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

这很好用,不需要单独的查找表。但是,我很确定hte Blob的filename属性不能包含'/'所以我该如何处理上面示例中名为some-folder或maybe-another-folder的文件夹(其中有很多文件夹)?

此外,不同文件夹中的图像名称几乎肯定会重叠,例如

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您应该让上传表单指定文件的完整路径作为附加字段,并完全忽略上传文件名,或将其附加到提供的路径。

然后,您应该创建一个数据存储模型,其中BlobReferenceProperty引用blob,并以完整路径作为键名。这样,您可以通过简单的数据存储区查找blob而不是更昂贵的查询,并且您还可以针对实体存储任何相关信息(例如标题信息等)。

答案 1 :(得分:1)

不是直接答案,而是更多建议:

如果在您的应用程序中完全可能,我建议您尝试迁移所有动态图像以使用blobstore的get_serving_url方法。而不是有一个处理程序来手动提供你的blob。它是一个更有效的服务图像系统,为您提供了访问内置调整大小的未来灵活性。

这将要求您的迁移变得更复杂,但从长远来看,我相信会好得多。

  • 您需要像现在一样将每个图像发布到blobstore,并检索图像blob的serving url
  • 保留 old-urls的本地地图 =>迁移期间 new-serving-urls
  • 将所有 old-urls 更新到您的应用程序/数据中的 new-serving-urls

取决于您在以前版本的应用中存储所有图片链接的方式,这可能是微不足道或几乎不可能的,但我认为值得记住。