functions/upload_image/main.py (40 lines of code) (raw):

# Copyright 2018 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. """ Cloud Function for processing uploaded images. """ import os import uuid from google.cloud import storage from wand.image import Image client = storage.Client() BUCKET = os.environ.get('GCS_BUCKET') FILENAME_TEMPLATE = '{}.png' EXPECTED_WIDTH = 640 EXPECTED_HEIGHT = 640 def upload_image(request): # Set up CORS to allow requests from arbitrary origins. # See https://cloud.google.com/functions/docs/writing/http#handling_cors_requests # for more information. # For maxiumum security, set Access-Control-Allow-Origin to the domain # of your own. if request.method == 'OPTIONS': headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Max-Age': '3600' } return ('', 204, headers) headers = { 'Access-Control-Allow-Origin': '*' } file = request.files.get('filepond') if not file: return ("File is not found in the request.", 400, headers) data = file.read() with Image(blob=data) as image: image.transform(resize="{}x{}>".format(EXPECTED_WIDTH, EXPECTED_HEIGHT)) image.extent( width=EXPECTED_WIDTH, height=EXPECTED_HEIGHT, x=int((EXPECTED_WIDTH - image.width) / 2), y=-int((EXPECTED_HEIGHT - image.height) / 2) ) converted_image = image.make_blob(format='png') id = uuid.uuid4().hex filename = FILENAME_TEMPLATE.format(id) bucket = client.get_bucket(BUCKET) blob = bucket.blob(filename) blob.upload_from_string(converted_image, content_type='image/png') return (id, 200, headers)