将大型视频文件上传到 Google App Engine

Posted

技术标签:

【中文标题】将大型视频文件上传到 Google App Engine【英文标题】:Uploading large video file to Google App Engine 【发布时间】:2020-11-24 19:35:12 【问题描述】:

我正在尝试通过 Google App Engine 将大型视频上传到 Google Cloud Storage。

我遵循了这篇文章中提到的上传大型电子表格的原则。 Can't upload large files to Python + Flask in GCP App Engine

我已经使用 dropzone.js 设置了分块

我已经在 main.py 中设置了一个上传,我希望将文件块上传到应用程序的 tmp 目录中,并设置了在所有部分到位后将完成的文件移动到 Google Cloud Storage 的逻辑。

我收到以下错误消息:

TypeError: write() 参数必须是 str,而不是字节

这是我的后端代码

从烧瓶进口烧瓶,render_template,请求,重定向,url_for 从 google.cloud 导入存储 从 flask_dropzone 导入 Dropzone 从 werkzeug.utils 导入安全文件名 导入操作系统 导入base64 app = Flask(__name__, template_folder='./templates', static_folder="./static") dropzone = Dropzone(应用程序) app.config['UPLOAD_PATH'] = '/tmp' @app.route('/', methods=['GET', 'POST']) 定义索引(): 返回渲染模板('index.html') @app.route('/upload', methods=['POST', 'GET']) 定义上传(): 如果 request.method == 'POST': upload_file = request.files.get('文件') tmp_file_path = '/tmp/' + upload_file.filename 使用 open(tmp_file_path, 'a') 作为 f: f.write(uploaded_file.read()) chunk_index = int(flask.request.form.get('dzchunkindex')) 如果 (flask.request.form.get('dzchunkindex') 不是无)否则 0 chunk_count = int(flask.request.form.get('dztotalchunkcount')) if (flask.request.form.get('dztotalchunkcount') 不是 None) else 1 如果 (chunk_index == (chunk_count - 1)): print('保存文件到存储器') 打印(块数) storage_client = storage.Client() storage_bucket = storage_client.get_bucket('percy-277618.appspot.com') blob = storage_bucket.blob(upload_file.filename) blob.upload_from_filename(tmp_file_path,client=storage_client) print('保存到存储') print('删除临时文件') os.remove(tmp_file_path) 如果 __name__ == '__main__': app.run(主机='127.0.0.1',端口=8080,调试=真)

这是我的前端代码。

Dropzone.options.uploadwidget = 参数名称:'文件', forceChunking:是的, 超时:300000, 分块:是的, 网址:'/上传', 块大小:10485760, 最大文件大小:1025, ;

【问题讨论】:

我发现了一些 *** 链接1、2,它们解释了此错误的原因,可能会对您有所帮助。包含的建议是以二进制模式打开文件(在模式参数中包含“b”)或将字节转换为 str。我希望这会有所帮助并消除您的错误。 【参考方案1】:

使用uploaded_file.read() 生成字节,而不是字符串。你应该在binary mode中打开文件:

with open(tmp_file_path, 'ab') as f:

【讨论】:

谢谢达斯汀。当我尝试这个时,我在应用引擎 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8c in position 5: invalid start byte 中收到以下错误。由于它是正在上传的视频,因此解码设置是否为 utf-8 而不是其他设置。 utf-8 不仅适用于文本吗? 糟糕,问题读得太快,错过了视频。更新了我的答案! 谢谢达斯汀,这行得通。我不得不将 yaml 文件更改为 instance_class: F4_1G 以使其有足够的处理能力来处理更大的视频文件。 很高兴听到这个消息!如果解决了问题,请不要忘记将其标记为已接受的答案。谢谢!

以上是关于将大型视频文件上传到 Google App Engine的主要内容,如果未能解决你的问题,请参考以下文章

将大型视频文件上传到服务器,解决方案?

使用 ajax 和 google app 脚本将文件上传到驱动器

使用 iOS SDK 将大型视频上传到 Facebook

Google App Engine 大文件上传

SpringCloud上传大型视频文件到服务器,解决方案

SpringCloud上传大型视频文件到服务器,解决方案