【问题标题】:Upload image to google cloud store through a web page form python, google app engine, angularjs通过网页表单python、google app engine、angularjs上传图片到google cloud store
【发布时间】:2015-10-22 10:29:11
【问题描述】:

首先让我说

我想我已经阅读了所有与此主题相关的堆栈交换帖子。*

我想做的事:

  1. 我正在尝试允许某些用户通过我网站上的表单将图像发送到谷歌云存储..
  2. 另一个要求除了将该图像发送到云存储之外,我还需要在数据存储中创建该图像的模型及其相关属性。

我不确定最好的解决方法是什么,因为..

我读过的方法:

有很多方法可以将图像存储到云存储中:

我已经阅读了很多相互矛盾的信息,

我读了这么多,我无法直截了当,

然而,

我认为解决方案是:

对于 blobstore

  1. blobstore.uploadtocloudstoragething 方法可能有也可能没有文件上传限制大小(不,这不是实际的调用或方法名称) 2. blobstore 方法听起来像是要被淘汰了??

对于 Jason API

“但是,客户端库包含 App Engine 优化,因此使用 REST API 可能需要额外的开发时间。注意:App Engine 开发服务器支持 Cloud Storage 客户端。它不支持'不支持 REST API。"

对于客户端库

我不知道。到目前为止看起来还不错。这是我正在考虑使用的方法:

"cloudstorage.open(filename, mode='r', content_type=None, 选项=无, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=无)

在读取模式下 (r) 打开指定的云存储 读取对象。在写模式 w 下,如果指定的文件存在,则 打开它进行覆盖(不支持追加)。如果文件 不存在,在指定的bucket中创建。”

我正在使用的东西

  1. 谷歌应用引擎
  2. Python(用于处理程序、模型等)
  3. angularjs 和 jquery(前端)
  4. json 有时(后端)
  5. GAE 样板(不要问)

我想我会做什么:

  1. 获取用户图片:

所以,我找到了我测试过的这个表格。它确实从您的计算机中获取文件:

<form action="<?php echo $upload_url?>" enctype="multipart/form-data"
method="post">
Files to upload: <br>    <input type="file" name="uploaded_files"    size="40">    <input type="submit" value="Send">

(不,我不能在操作中使用 php 垃圾。我从文档中的某个地方获取它,但我对其进行了测试,它确实抓取了一个文件,不,它不会发送,它期望它会是愚蠢的)

  1. 修改我当前的处理程序(负责在数据存储中创建图像模型)以也使用

这个方法:

"cloudstorage.open(filename, mode='r', content_type=None, 选项=无, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=无)

在读取模式下 (r) 打开指定的云存储 读取对象。在写模式 w 下,如果指定的文件存在,则 打开它进行覆盖(不支持追加)。如果文件 不存在,在指定的bucket中创建。”

我目前遇到的问题

我不知道那个表单是如何工作的,我不知道如何从这个表单获取正确的信息给处理程序,以及处理程序需要什么信息,所以我可以处理它,创建模型(我已经知道如何在数据存储中创建模型,已经这样做了),并使用此方法将图像发送到谷歌云存储:

"cloudstorage.open(filename, mode='r', content_type=None, 选项=无, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=无)

在读取模式下 (r) 打开指定的云存储 读取对象。在写模式 w 下,如果指定的文件存在,则 打开它进行覆盖(不支持追加)。如果文件 不存在,在指定的bucket中创建。”

谁能给我一个例子?我找不到任何关于在表单中放入什么内容的好的相关帖子或文档,这样它将抓取文件,抓取用户填写的其他表单数据,然后最终将图像发送到谷歌云存储。

--更新--:

所以,在发布此消息后,我立即在 gcs.open 上进行了谷歌搜索,结果导致了此帖子:

how to upload image to the cloud storage via app engine?

我相信这可以解决后端问题,我确实还有一个问题。

重新粘贴问题:

问题:

  1. 我不知道图片名称是什么,我想使用现有的,或者随机的。有什么建议吗?

  2. 我在哪里粘贴这个:enctype="multipart/form-data"?

  3. 2 号会不会弄乱我的其他表单数据?我需要更多信息,而不仅仅是发布请求中的这张图片

【问题讨论】:

    标签: python image google-app-engine upload google-cloud-storage


    【解决方案1】:

    您还可以使用签名表格直接上传到 GCS。这样您就不需要 blobstore 或 post 处理程序。您可以使用策略文档控制超时和对象名。见我的回答here

    【讨论】:

    【解决方案2】:

    回答您的问题:

    1. 我不知道图像名称是什么,我想使用 现有的,或者可能是随机的。有什么建议吗?

    我认为这并不重要,只要确保考虑可能的名称冲突以及随后会发生什么。我认为这主要取决于您的应用程序的需求。您始终可以使用随机文件名,并将实际文件名保留在数据存储区中对 Cloud Storage 项的引用旁边。

    1. 我应该把它贴在哪里:enctype="multipart/form-data" ?

    Enctype 是一个表单属性,因此需要在 HTML 中的表单元素上设置:

    <form enctype="multipart/form-data" action="/save" ... >
    
    1. 2 号会弄乱我的其他表单数据吗?我需要更多信息 只有这张图片在发布请求中

    不,不应该。只需添加更多的表单输入字段,它们都将与表单数据一起提交。

    【讨论】:

    • 1.谢谢 :) 目前正在寻找使用唯一性的方法。考虑只生成一个名称,然后查看该文件是否存在于 gcs 中。不过,这可能会浪费查询。 2. 谢谢!我最终使用了
      并且进展顺利。 3. 还没试过,谢谢你的信息:)
    • 关于额外的查询是正确的。您可以做的(假设您将其他数据存储在文件的数据存储中)是使用数据存储键作为文件名。这保证是独一无二的。
    • 这是一个有趣的想法,我想知道可能会给数据存储带来什么样的安全风险,因为很容易通过浏览器公开密钥名称,但在顶部附加随机数据那个 id 能帮上忙吗?可能会被解码。不确定..我做了另一个使用独特的项目,但我不记得我使用的方法..
    • 我不认为公开数据存储密钥会有问题,除非您使用密钥的敏感 ID 部分。但是,我想更多的是您可以使用密钥来存储它(确保唯一性),但是当从 Cloud Storage 检索它以便将其发送给用户时,您将使用您存储在中的原始文件名重命名文件数据存储。
    • 我不确定这会如何发挥作用,因为云存储有实际的图像,而数据模型包含该图像的路径。如果它们不一样,就不可能向用户显示图像。我确实找到了我的旧代码,但是仍然会涉及对数据存储的查询,并且使用来自 webapp2 extras 的 Unique 类
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2013-07-13
    • 2013-08-25
    • 2015-02-07
    • 1970-01-01
    • 2014-11-22
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多