Files
Morgenstern/engomo/javascript_base64_fotos.md

4.1 KiB
Raw Permalink Blame History

Javascript zum Fotos als base64 in Datenbank zu schreiben

Zusätzlich zu den Originalfotos wird auch ein Thumbnail mit 10% größe erstellt.

// 1. JavaTypen holen
var Base64               = Java.type('java.util.Base64');
var ByteArrayInputStream = Java.type('java.io.ByteArrayInputStream');
var ByteArrayOutputStream= Java.type('java.io.ByteArrayOutputStream');
var ImageIO              = Java.type('javax.imageio.ImageIO');
var BufferedImage        = Java.type('java.awt.image.BufferedImage');
var AffineTransform      = Java.type('java.awt.geom.AffineTransform');
var AffineTransformOp    = Java.type('java.awt.image.AffineTransformOp');

// 2. Höchste MedienID für diese protokoll_id und raum_id ermitteln
var hochste_medien_id = 0;
try {
    var dataArray = datasourceHelper.get("SQL-hochste_medien_id");
    if (dataArray && dataArray.getRows().size() > 0) {
        var firstRow = dataArray.getRow(0);
        if (firstRow && firstRow.getFieldAsString("MEDIEN_ID")) {
            hochste_medien_id = parseInt("" + firstRow.getFieldAsString("MEDIEN_ID"), 10);
        }
    }
} catch (e) {
    // Falls die Abfrage fehlschlägt, bleibt hochste_medien_id bei 0
}

// 3. Base64Bilder aufsplitten
var medienBildValue = medien_bild.getValue() || "";
var base64Imgs = [];
if (medienBildValue) {
    var splitValues = medienBildValue.split(";");
    for (var i = 0; i < splitValues.length; i++) {
        var val = splitValues[i].trim();
        if (val) {
            base64Imgs.push(val);
        }
    }
}

// 4. ZustandsVariablen
var protokoll_id = "" + (state.protokoll_id || '');
var raum_id = "" + (state.raum_id || '');
var raum_bezeichnung = "" + (state.raum_bezeichnung || 'default_raum_bezeichnung');
var medien_beschreibung_val = "" + (medien_beschreibung.getValue() || '');

// 5. Funktion für Thumbnails
function makeThumbnail(base64String, scale) {
    try {
        var bytes = Base64.getDecoder().decode(base64String);
        var inStream = new ByteArrayInputStream(bytes);
        var img = ImageIO.read(inStream);
        
        var newW = Math.round(img.getWidth() * scale);
        var newH = Math.round(img.getHeight() * scale);
        
        var thumb = new BufferedImage(newW, newH, img.getType());
        
        var at = new AffineTransform();
        at.scale(newW / img.getWidth(), newH / img.getHeight());
        var op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
        thumb = op.filter(img, thumb);
        
        var outStream = new ByteArrayOutputStream();
        ImageIO.write(thumb, 'png', outStream);
        var thumbBytes = outStream.toByteArray();
        return Base64.getEncoder().encodeToString(thumbBytes);
    } catch (e) {
        return "";
    }
}

// 6. Bilder einzeln verarbeiten
for (var idx = 0; idx < base64Imgs.length; idx++) {
    try {
        // Wenn hochste_medien_id 0 ist, beginnen wir mit 1, sonst hochste_medien_id + 1
        var newMedienNum = hochste_medien_id === 0 ? idx + 1 : hochste_medien_id + idx + 1;
        var newMedienId = "" + newMedienNum;
        var base64String = base64Imgs[idx];
        var thumbnailString = "";
        
        try {
            thumbnailString = makeThumbnail(base64String, 0.1);
        } catch (e) {
            // Fehler beim Thumbnail abfangen
        }
        
        // SQL-Statement erstellen
        state.medien_id = newMedienId;
        state.sql =
          "INSERT INTO [engomo].[dbo].[begehung_raume_medien] " +
          "(protokoll_id, raum_id, raum_bezeichnung, medien_id, medien_bild, medien_thumb, medien_beschreibung) " +
          "VALUES (" +
            "'" + protokoll_id + "', " +
            "'" + raum_id + "', " +
            "'" + raum_bezeichnung + "', " +
            "'" + newMedienId + "', " +
            "N'" + base64String + "', " +
            "N'" + thumbnailString + "', " +
            "N'" + medien_beschreibung_val + "'" +
          ");";
        
        // SQL ausführen
        flowHelper.execute('dynamicSQL');
        
        // Kurze Pause zwischen den Einfügungen
        java.lang.Thread.sleep(100);
        
    } catch (e) {
        // Bei Fehler fortfahren mit dem nächsten Bild
        continue;
    }
}