我正在开发一个小型应用程序,它将从用户那里获取非常大的文件并将其上传到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)
所以我要寻找的是正常上传大文件,而不会出现此错误...
答案 0 :(得分:1)
uploadUrl在大约10分钟后过期,我已经看到work around在使用jQuery提交表单时正在创建URL。
直接上传到Cloud Storage也是一种选择,并且有可用的存储client library,但仅在Python 3运行时支持。