当前位置: 首页 > 知识库问答 >
问题:

如何使用Python Flask将文件从Google App Engine上传到Google云存储?

陆翔飞
2023-03-14

我想上传文件从谷歌应用程序引擎到谷歌云存储我使用Pyhton 3.8和烧瓶。

app.yaml:

runtime: python38

要求。文本

Flask==2.0.0;
google-cloud
google-cloud-storage

我试图上传文件使用Flask(https://www.tutorialspoint.com/flask/flask_file_uploading.htm) /tmp(在App Engine临时存储(https://cloud.google.com/appengine/docs/standard/python3/using-temp-files))

然后我尝试使用以下代码示例从临时存储上传到Google云存储:(https://cloud.google.com/storage/docs/uploading-objects#storage-上载对象代码(示例)

但这给了我一个错误:

OSError: [Errno 30] Read-only file system: 'file.xlsx'

我也尝试从这个样本:(https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/storage/api-client/main.py)并给我同样的错误。

然后我尝试与gsutil(https://cloud.google.com/storage/docs/uploading-objects#gsutil)使用subprocess.check_output(返回值x=os.system(...))仍然给我同样的错误。

有人能帮我吗?我该怎么办?

#################################################

解决了的

#################################################

谢谢江户·阿克塞,我的错误是使用了“/tmp”而不是“/tmp/”,非常感谢您的帮助。

下面是已经运行的完整代码。

from flask import Flask, request
from werkzeug.utils import secure_filename
from google.cloud import storage
import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = "/tmp/"

@app.route('/')
def index():
    page = '''
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input name="file" class="custom-file-input" type="file">
        <button type="submit" class="btn btn-success">Submit</button>
    </form>
    '''
    return page

@app.route('/upload',methods=["POST"])
def upload():
    try:
        if request.method == 'POST':
            f = request.files['file']
            f.save(os.path.join(app.config['UPLOAD_FOLDER'],secure_filename(f.filename)))
            
            #Start Do Main Process Here
            TMP_FILE_NAME = os.path.join(app.config['UPLOAD_FOLDER'],secure_filename(f.filename))
            BUCKET_NAME = 'fsample123'
            result = upload_blob(BUCKET_NAME, TMP_FILE_NAME, f"tmp/{secure_filename(f.filename)}")
            #End Do Main Process Here
            return result
            
    except Exception as e:
        return str(e)

def upload_blob(bucket_name, source_file_name, destination_blob_name):
    """Uploads a file to the bucket."""
    # SOURCE:
    # https://cloud.google.com/storage/docs/uploading-objects#uploading-an-object

    # The ID of your GCS bucket
    # bucket_name = "your-bucket-name"
    # The path to your file to upload
    # source_file_name = "local/path/to/file"
    # The ID of your GCS object
    # destination_blob_name = "storage-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(source_file_name)
    return "File {} uploaded to {}.".format(source_file_name, destination_blob_name)

if __name__ == '__main__':
   app.run()

共有1个答案

江阳羽
2023-03-14

所以问题不在于上传到地面军事系统,而在于你创建的临时文件。

唯一具有写访问权限的目录是/tmp,请注意,它不会在GAE实例之间共享,并且在实例重新启动时会消失。。。

from google.cloud import storage


def upload_blob(bucket_name, source_file_name, destination_blob_name):
    """Uploads a file to the bucket."""
    # SOURCE:
    # https://cloud.google.com/storage/docs/uploading-objects#uploading-an-object

    # The ID of your GCS bucket
    # bucket_name = "your-bucket-name"
    # The path to your file to upload
    # source_file_name = "local/path/to/file"
    # The ID of your GCS object
    # destination_blob_name = "storage-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(source_file_name)
    print(
        "File {} uploaded to {}.".format(
            source_file_name, destination_blob_name
        )
    )


TMP_PATH = "/tmp/"
TMP_FILE_NAME = f"{TMP_PATH}file.xlsx"
BUCKET_NAME = '<your-bucket-name>'


with open(TMP_FILE_NAME, "w") as outfile:
    outfile.write("write file action goes here")
upload_blob(BUCKET_NAME, TMP_FILE_NAME, "Target file path goes here...")
 类似资料:
  • 我从一个网址读取图像并处理它。我需要将这些数据上传到云存储中的一个文件中,目前我正在将这些数据写入一个文件,并上传该文件,然后删除该文件。有没有办法把数据直接上传到云端仓库?

  • 我正在尝试建立一个基于python的基本谷歌应用引擎站点,允许用户将文件上传到谷歌云存储(主要是图像) 我已经阅读了JSON API和GCS客户端库概述(以及blobstore等)的文档,但仍然没有很好地了解哪种方法是最好的以及它们之间的关系。如果有人能概述一下,或者给我指出一些我可以查看的资源,那就太好了 此外,任何相关的示例代码都会非常有用。我已经能够在此处运行上载示例,但不确定它们是否对应用

  • 问题内容: 我需要将某些文件类型从某些linux服务器备份到GDrive(不仅是可转换为GDocs格式的文件)。 用python脚本做到这一点的最简单,最优雅的方法是什么?与GDocs有关的任何解决方案都适用吗? 问题答案: 您可以使用Documents List API编写一个写入Drive的脚本: https://developers.google.com/google-apps/docume

  • 问题内容: 我目前正在使用一个php应用程序将图像上传到Google云存储平台,但是,与在我的本地服务器上不同,我在确定如何使这项工作方面遇到了很大的麻烦。 这正是我想做的事情: 将图像的路径写入我的Google Cloud SQL 实际将图像上传到Google云存储平台 从保存的SQL路径编写一个调用图像的脚本,然后发布到我的网站 谁能指出正确的方向? 谢谢! 问题答案: 像这样的事情对我来说适

  • 问题内容: 我遵循以下文档以将文件上传到Google云端硬盘:https : //developers.google.com/drive/android/files 现在,每次我要上传文件时,都会出现Google云端硬盘的弹出窗口,问我将其上传到哪里以及哪个名字。我不希望弹出窗口,我想直接上传文件。 有什么方法可以做到这一点?我找不到任何文档。我也发现了这一点:https : //develope