appengine/flexible/storage/main.py (34 lines of code) (raw):
# Copyright 2015 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# [START gae_flex_storage_app]
from __future__ import annotations
import logging
import os
from flask import Flask, request
from google.cloud import storage
app = Flask(__name__)
# Configure this environment variable via app.yaml
CLOUD_STORAGE_BUCKET = os.environ["CLOUD_STORAGE_BUCKET"]
@app.route("/")
def index() -> str:
return """
<form method="POST" action="/upload" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
"""
@app.route("/upload", methods=["POST"])
def upload() -> str:
"""Process the uploaded file and upload it to Google Cloud Storage."""
uploaded_file = request.files.get("file")
if not uploaded_file:
return "No file uploaded.", 400
# Create a Cloud Storage client.
gcs = storage.Client()
# Get the bucket that the file will be uploaded to.
bucket = gcs.get_bucket(CLOUD_STORAGE_BUCKET)
# Create a new blob and upload the file's content.
blob = bucket.blob(uploaded_file.filename)
blob.upload_from_string(
uploaded_file.read(), content_type=uploaded_file.content_type
)
# Make the blob public. This is not necessary if the
# entire bucket is public.
# See https://cloud.google.com/storage/docs/access-control/making-data-public.
blob.make_public()
# The public URL can be used to directly access the uploaded file via HTTP.
return blob.public_url
@app.errorhandler(500)
def server_error(e: Exception | int) -> str:
logging.exception("An error occurred during a request.")
return (
"""
An internal error occurred: <pre>{}</pre>
See logs for full stacktrace.
""".format(
e
),
500,
)
if __name__ == "__main__":
# This is used when running locally. Gunicorn is used to run the
# application on Google App Engine. See entrypoint in app.yaml.
app.run(host="127.0.0.1", port=8080, debug=True)
# [END gae_flex_storage_app]