python - 在 App Engine 上使用 Python 上传大文件时如何防止 Blob 存储上传 URL 过期

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

我正在开发一个小型应用程序,该应用程序将从用户处获取非常大的文件并将其上传到 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)

所以我正在寻找的是正常上传大文件并且不会出现此错误...

最佳答案

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

也可以选择直接上传到云存储,并且有一个存储 client library可用,但仅在 Python 3 运行时受支持。

关于python - 在 App Engine 上使用 Python 上传大文件时如何防止 Blob 存储上传 URL 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542858/

相关文章:

python - 为什么代码更改时自动重新加载仅用于使用 Gunicorn 进行调试?

python - 谷歌应用引擎: how to tell sort location for a user value?

python - 使用 python 检查 dev_appserver 是否在本地主机上运行

python - 使用 python-api-client 的异步 insertAll 请求

sql-server - Google Cloud App to Database 是加密的、私有(private)的还是需要保护?

google-bigquery - 将 BigQuery 查询结果直接写入 GCS - 可能吗?

python - 使用 SparkNLP 时,无法在 Dataproc 集群中读取本地数据

python - 从 MySQL 迁移到 Postgres 后了解 "SEPARATOR"处或附近的语法错误

python - 在kivy中通过id获取 child 并为其添加新标签

python - != vs <> 在 Python 中?