invoice-processing-pipeline/uploader/main.py (33 lines of code) (raw):
# Copyright 2022 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.
"""
This web app allows users to upload one or more files to a particular bucket,
where they may later be processed. The canonical use case is for uploading
invoices in human-readable form, with the expectation that the information
in those invoices will be later extracted and handled by an organization's
standard business practices.
Requirements:
- Python 3.7 or later
- All packages in requirements.txt installed
- A bucket to place the files in
- Software environment has ADC or other credentials to write to the bucket
- The name of the bucket (not the URI) in the environment variable BUCKET
This Flask app can be run directly via "python main.py" or with gunicorn
or other common WSGI web servers.
"""
from flask import Flask, render_template, request
import os
from uuid import uuid4
from google.cloud import storage
app = Flask(__name__)
@app.route("/", methods=["GET"])
def show_upload_page():
return render_template("index.html"), 200
@app.route("/", methods=["POST"])
def handle_uploads():
BUCKET_NAME = os.environ.get("BUCKET")
client = storage.Client()
try:
bucket = client.get_bucket(BUCKET_NAME)
except Exception as e:
return f"Could not open bucket: {e}", 400
handled = 0
for key in request.files:
for file in request.files.getlist(key):
if uploaded_to_storage(file, bucket):
handled += 1
return f"Uploaded {handled} file(s)", 200
def uploaded_to_storage(file, bucket):
mimetype = file.mimetype
if mimetype is None:
mimetype = "application/octet-stream"
blob_key = f"incoming/{uuid4()}"
blob = bucket.blob(blob_key)
blob.content_type = mimetype
blob.upload_from_file(file.stream)
return True
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8080, debug=True)