【问题标题】:How to prevent Blobstore upload URL from expiring when uploding large files using Python on App Engine在 App Engine 上使用 Python 上传大文件时如何防止 Blob 存储上传 URL 过期
【发布时间】:2019-10-25 19:49:44
【问题描述】:

我正在开发一个小应用程序,它会从用户那里获取非常大的文件并将它们上传到 Blobstore,然后处理它们并将它们移动到 Google Cloud Storage。

我为此使用 Python,我的代码如下。在 Python2.7 中使用标准环境

当用户添加小文件时,他们通常可以上传数据,整个工作流程很顺利,但是当他们加载大小超过 1 或 2 GB 的文件时,他们会收到以下错误

错误的错误请求

上传网址已过期。

该应用程序是一个网络应用程序,它加载表单以供他们上传文件。用户将看到表单,点击浏览按钮加载他们的文件,然后点击提交按钮开始上传

import os
import urllib
import webapp2
import cgi
import argparse
import datetime
import pprint
import re
import webapp2
import requests
import cloudstorage
import logging

from flask import Flask, request
from google.appengine.api import app_identity
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.api import users
from google.appengine.api import app_identity

class MainHandler(webapp2.RequestHandler):
  def get(self):
    gs_bucket_name = 'BUCKET_NAME'
    upload_url = blobstore.create_upload_url('/upload',gs_bucket_name=gs_bucket_name)

    self.response.write('<html>\n<body>\n')
    self.response.write('<form action="%s" method="POST" enctype="multipart/form-data">\n'% upload_url)
    self.response.write('<input type="file" name="file" accept=".mp4"><br>\n')
    self.response.write('<input type="submit" name="submit" value="Submit"></form>\n')
    self.response.write('</body>\n</html>\n\n')

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    # 'file' is file upload field in the form
    upload_files = self.get_uploads('file')

    file_infos = self.get_file_infos()
    blob_info = upload_files[0]
    file_info = file_infos[0]

    glob_gs_object_name=file_info.gs_object_name[3:]
    glob_filename=upload_files[0].filename

    cloudstorage.copy2(file_info.gs_object_name[3:], '/BUCKET_NAME/'+upload_files[0].filename, metadata=None, retry_params=None)

    try:
        cloudstorage.delete(file_info.gs_object_name[3:])
    except cloudstorage.NotFoundError:
        pass

    self.response.write(complete_upload)

app = webapp2.WSGIApplication([('/', MainHandler),('/upload', UploadHandler)],debug=True)

所以我一直在寻找的是让大文件正常上传并且没有出现这个错误......

【问题讨论】:

    标签: python google-app-engine google-cloud-platform blobstore


    【解决方案1】:

    uploadUrl 大约 10 分钟后过期,我看到 work around 在使用 jQuery 提交表单时创建 URL。

    直接上传到 Cloud Storage 也是一种选择,并且有一个 Storage client library 可用,但它仅在 Python 3 运行时受支持。

    【讨论】:

    • 嗯,我已经设法从 GCP 实例上传大于 50GB 的文件,所以我知道上面的代码将能够处理大文件,但问题是我不知道如何处理它URL过期问题...我还读到Blobstore将用于处理大文件而不是GCS API,这就是我选择Blobstore的原因...所以我想我错了?使用上面链接的 Cloud Storage 库,我可以上传的最大大小是多少?
    • 我将使用 Python3 和 Storage 客户端库制作另一个版本的应用程序,希望它对我有用。将在我实现基本代码进行上传后更新...
    猜你喜欢
    • 2011-07-23
    • 2020-09-24
    • 1970-01-01
    • 2015-06-16
    • 2021-10-21
    • 2010-10-24
    • 2013-09-01
    • 2013-02-22
    • 2020-07-12
    相关资源
    最近更新 更多