在App Engine上使用Python上载大文件时,如何防止Blobstore上传URL过期

时间:2019-06-11 11:39:19

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

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

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

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

错误的错误请求

上传URL已过期。

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

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)

所以我要寻找的是正常上传大文件,而不会出现此错误...

1 个答案:

答案 0 :(得分:1)

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

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