Skip to content

Instantly share code, notes, and snippets.

@Overbryd
Last active December 1, 2023 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Overbryd/1fa152f5ca1ccc6c17b7e2dee8b5ccbd to your computer and use it in GitHub Desktop.
Save Overbryd/1fa152f5ca1ccc6c17b7e2dee8b5ccbd to your computer and use it in GitHub Desktop.
# ... snip
def generate_upload_signed_url_v4(bucket_name, blob_name, *, origin=None):
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(blob_name)
headers = {}
if origin:
headers['origin'] = origin
return blob.generate_signed_url(
version="v4",
expiration=datetime.timedelta(minutes=60),
method="POST",
headers=headers
)
@app.route('/uploads/<string:upload_id>', methods=['GET'])
def upload(upload_id):
bucket_name = os.environ['GOOGLE_STORAGE_BUCKET_NAME']
file_name = f'uploads/{request.environ["iap_user"]["username"]}/{upload_id}'
origin = cors_origin(request)
signed_upload_url = generate_upload_signed_url_v4(bucket_name, file_name, origin=origin)
return render_template('upload.html', upload_id=upload_id, signed_upload_url=signed_upload_url, current_user=request.environ['iap_user'])
# ... snip
<script src="https://releases.transloadit.com/uppy/v2.1.0/uppy.min.js"></script>
<script type="text/javascript">
window.addEventListener('DOMContentLoaded', (e) => {
const progressBar = document.getElementById('progressbar');
const dropzone = document.getElementById('dropzone');
const decryptUrl = '{{ url_for("decrypt_upload", upload_id=upload_id) | safe }}';
var uppy = new Uppy.Core({
autoProceed: true,
allowMultipleUploadBatches: false,
debug: false,
restrictions: {
maxNumberOfFiles: 1,
allowedFileTypes: ['text/csv', '.csv']
},
});
uppy.use(Uppy.XHRUpload, {
method: 'POST',
endpoint: '{{ signed_upload_url | safe }}',
getResponseData: () => { return {url: decryptUrl} }
});
uppy.use(Uppy.DragDrop, { target: '#dropzone' });
uppy.on('upload', () => {
dropzone.style.display = 'none';
});
uppy.on('complete', () => {
window.location.href = decryptUrl;
});
uppy.on('progress', (progress) => {
progressBar.style.width = `${progress}%`;
});
});
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment