This commit is contained in:
Thomas Forgione 2024-07-22 11:23:33 +02:00
parent 586c585980
commit d499a8b279
2 changed files with 50 additions and 1 deletions

50
app.py
View File

@ -1,12 +1,13 @@
#!/usr/bin/env python #!/usr/bin/env python
from flask import Flask, redirect, request, render_template, send_from_directory, session from flask import Flask, redirect, request, render_template, send_from_directory, session
import io
import json import json
import os import os
from os.path import join from os.path import join
import sqlite3 import sqlite3
import uuid import uuid
from typing import Optional import tarfile
from . import db, config, scanner, calibration from . import db, config, scanner, calibration
app = Flask(__name__) app = Flask(__name__)
@ -269,6 +270,53 @@ def validate_calibration():
return redirect('/') return redirect('/')
@app.route('/download-object/<id>')
def download_object(id: int):
conn = db.get()
object = db.Object.get_from_id(id, conn).full(conn)
def generate():
for acquisition_index, acquisition in enumerate(object.acquisitions):
acquisition_dir = join(config.OBJECT_DIR, str(object.id), str(acquisition.id))
# Send each image
for image in os.listdir(acquisition_dir):
# Generate tar header for file
image_path = join(acquisition_dir, image)
bytes = io.BytesIO()
stat = os.stat(image_path)
# Create dummy tar to extract tar header for file
with tarfile.open(fileobj=bytes, mode='w') as buffer:
tar_info = tarfile.TarInfo(image_path)
tar_info.name = f'object/{acquisition_index}/{image}'
tar_info.size = stat.st_size
buffer.addfile(tar_info)
# Yield header
value = bytes.getvalue()
yield value[:512]
# Yield file content, by chunks of 4MiB
chunk_size = 4_194_304
bytes_len = 0
with open(image_path, 'rb') as file:
while True:
bytes = file.read(chunk_size)
if len(bytes) == 0:
break
bytes_len += len(bytes)
yield bytes
yield b'\x00' * (512 - bytes_len % 512)
return app.response_class(generate(), mimetype='application/x-tar')
@app.route('/static/<path:path>') @app.route('/static/<path:path>')
def send_static(path): def send_static(path):
return send_from_directory('static', path) return send_from_directory('static', path)

View File

@ -4,6 +4,7 @@
<section class="section"> <section class="section">
<div class="container content"> <div class="container content">
<h1 class="title">{{ object.name }}</h1> <h1 class="title">{{ object.name }}</h1>
<a href="/download-object/{{ object.id }}">Télécharger les données de l'objet</a>
{% if object.acquisitions %} {% if object.acquisitions %}
<div class="fixed-grid has-6-cols"> <div class="fixed-grid has-6-cols">
<div class="grid"> <div class="grid">