我正在尝试使用Flask通过App Engine实例将一些图像上传到GCS,但是每次上传文件时,当我下载文件时,都会收到损坏的文件。我究竟做错了什么 ?
我已经按照文档中的方式下载并使用了Google Cloud Storage客户端。
@app.route('/upload', methods=['POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
extension = secure_filename(file.filename).rsplit('.', 1)[1]
options = {}
options['retry_params'] = gcs.RetryParams(backoff_factor=1.1)
options['content_type'] = 'image/' + extension
bucket_name = "gcs-tester-app"
path = '/' + bucket_name + '/' + str(secure_filename(file.filename))
if file and allowed_file(file.filename):
try:
with gcs.open(path, 'w', **options) as f:
f.write(str(file))
print jsonify({"success": True})
return jsonify({"success": True})
except Exception as e:
logging.exception(e)
return jsonify({"success": False})
谢谢你的帮助 !!
您正在上传(写入gcs流)文件对象的str表示形式,而不是文件内容。
尝试这个:
@app.route('/upload', methods=['POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
extension = secure_filename(file.filename).rsplit('.', 1)[1]
options = {}
options['retry_params'] = gcs.RetryParams(backoff_factor=1.1)
options['content_type'] = 'image/' + extension
bucket_name = "gcs-tester-app"
path = '/' + bucket_name + '/' + str(secure_filename(file.filename))
if file and allowed_file(file.filename):
try:
with gcs.open(path, 'w', **options) as f:
f.write(file.stream.read())# instead of f.write(str(file))
print jsonify({"success": True})
return jsonify({"success": True})
except Exception as e:
logging.exception(e)
return jsonify({"success": False})
但这不是执行此操作的最有效方法,而且,直接从App Engine上传文件的上限为32mb,避免这种情况的方法是通过使用GCS签名上传网址并直接从前端上传文件到GCS,或者您可以使用blobstore和处理程序创建文件上传网址,以执行上传后处理,如下所示:https : //cloud.google.com/appengine/docs/python/blobstore/
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句