【问题标题】:Does Google App Engine allow creation of files and folders on the server?Google App Engine 是否允许在服务器上创建文件和文件夹?
【发布时间】:2011-02-11 04:38:41
【问题描述】:

我知道 Google App Engine 提供免费空间,但我想知道它是否仅用于将数据存储在其数据库中,或者它是否还允许我在服务器端创建文件和目录来存储我的数据?比如我可以使用下面的方法来保存文件吗?

  public static void saveFile(String File_Path,StringBuffer Str_Buf,boolean Append)
  {
    FileOutputStream fos=null;
    BufferedOutputStream bos=null;

    try
    {
      fos=new FileOutputStream(File_Path,Append);
      bos=new BufferedOutputStream(fos);
      for (int j=0;j<Str_Buf.length();j++) bos.write(Str_Buf.charAt(j));
    }
    catch (Exception e) { e.printStackTrace(); }
    finally
    {
      try 
      {
        if (bos!=null)
        {
          bos.close();
          bos=null;
        }
        if (fos!=null)
        {
          fos.close();
          fos=null;
        }
      }
      catch (Exception ex) { ex.printStackTrace(); }
    }
  }

【问题讨论】:

    标签: google-app-engine file save


    【解决方案1】:

    不,不允许文件 i/o。您可以使用 blob 来存储图像或文本。

    【讨论】:

    • 嗨。可以将大型 Zip 文件存储在 blob 中
    • @ShreeshaS 是的,blobstore 可以存储它。免费限制为 5GB 空间,请注意。
    【解决方案2】:

    您可以从自己的项目中读取文件 - You cannot write to the file system

    来自常见问题解答 ...

    为什么我不能写入这个文件?

    由于应用程序的分布式特性,App Engine 不支持写入本地文件。相反,必须持久化的数据应该存储在分布式数据存储中。有关更多信息,请参阅运行时沙箱上的文档

    App Engine 应用程序不能:

    • 写入文件系统。应用程序必须使用 App Engine 数据存储来存储持久数据。允许从文件系统读取,所有随应用上传的应用文件都可用。

    • 打开一个套接字或直接访问另一个主机。应用程序可以使用 App Engine 网址提取服务分别在端口 80 和 443 上向其他主机发出 HTTP 和 HTTPS 请求。

    • 产生一个子进程或线程。对应用程序的 Web 请求必须在几秒钟内在单个进程中处理。需要很长时间才能响应的进程会被终止,以避免 Web 服务器过载。

    • 进行其他类型的系统调用。

    【讨论】:

    • 这是多余的,你现在可以保存到临时文件夹,据我所知。
    【解决方案3】:

    我认为应该提到使用文件 API is now deprecated 写入 blobstore,并且 Google 正在转向云存储。

    【讨论】:

      【解决方案4】:

      新信息。 答案是肯定的,但您必须使用他们的云存储进行写访问。您不能将常规文件用于您的目的。

      https://developers.google.com/appengine/docs/java/googlecloudstorageclient/

      它也有 Python API 和 RESTful API。

      【讨论】:

        【解决方案5】:

        Google App Engine 是一种可扩展且无状态的服务。

        • 可扩展意味着多个并行实例开始/关闭/回收(弹性)。
        • 如果一个实例将数据写入本地 SQLite DB,则其他并行实例无法查看或了解数据。这将导致不一致。
        • 您根本无法在无状态服务中使用“本地写入”模式。

        因此,您必须通过网络将应用引擎外部的数据(状态)写入持久存储(例如 firebase、cloud sql、cloud storage、redis)。

        如果您想要“一站式”计算和本地存储的便利性,您将不得不使用具有持久块存储的虚拟机。

        【讨论】:

          【解决方案6】:

          如果您使用/tmp 文件夹,有一种方法。但是,它会将文件存储在实例的 RAM 中,因此请注意,它会占用内存并且是临时的(正如文件夹名称所暗示的那样)。

          更多详情,请参阅文档herehere

          在大多数情况下,最好使用 Google Storage。

          另请注意,如果您选择灵活环境而不是标准环境,则写入文件系统没有问题(但是,请注意价格差异,例如this)。

          【讨论】:

            猜你喜欢
            • 2022-06-23
            • 1970-01-01
            • 2022-07-08
            • 2011-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多