• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Bild vor Upload verkleinern.

bodo92

Aktives Mitglied
Hallo zusammen,

habe mir die letzten Tage einen Wunderschönen Bild-Upload gebastelt.
Funktioniert auch super aber wenn man mehrere hochauflösenden Bilder hochlädt (vorallem Mobil) kann das emenz lange dauern.
Da hab ich mir die Frage gestellt ob man das Bild nicht schon Clientseitig verkleinern kann, habe hierzu auch ein Paar Themen gefunden deren Workaround auf Canvas hinausläuft.

Hat jemand hiermit schon Erfahrung gemacht..

Vielen lieben Dank vorab.
 
Siehe oben. ich mache das seit längerer Zeit mit Grunt.

Aber verarbeitest du damit auch user-generated content im Browser? Ich denke darum geht es ja.
Das klappt doch nur bei Bildern, die du als Entwickler verwendest? Grunt hat im Production Env ja nichts zu suchen?

Oder täusche ich mich jetzt komplett?
 
Genau ich möchte dem "User" was in meinem Fall ein paar ausgesuchte Kameraden sind ermöglichen Bilder von einem Einsatz hochzuladen.
Die Bilder sollen nach dem Einsatz direkt an einem PC von der Digitalkamera hochgeladen werden können, da viele Kameraden aber kaum mit einem PC umgehen können möchte ich für dafür eine angenehme und einfache Lösung Entwickeln.
 
Das klappt doch nur bei Bildern, die du als Entwickler verwendest? Grunt hat im Production Env ja nichts zu suchen?

Es läuft über einen Node Server, und ich hatte ursprünglich an Development gedacht, wo ich Bilder in Ordner kopiere und diese per imagemin minified werden.

Aber auch für das Szenario des Users, der Bilde hochlädt, gibt es diverse Plugins - flow.js fällt mir auf Anhieb ein.
 
Ok danke für die Anregung aber das ist ja wieder ein komplettes Framework wurde ich gerne drauf verzichten..

Meine Bilder verkleinere ich jetzt mit Canvas, hier wird mein Bild auf maximal 1000px breite oder höhe verkleinert.
Ich suche jetzt nach einer Lösung entweder die Dateien im Fileinput-Element zu ersetzen oder neue Objekte aus den Bildern zu erstellen und die dann per Ajax abzuschicken.

Hier mein Code der bei einer Änderung am Fileinput das Bild verkleinert und Thumbnails erstellt:
Code:
$("#uploadFiles").change(function(input) {+
    $("#uploadPictures").empty().parent().removeClass("hidden");
    for (var i = 0; i < input.target.files.length; i++) {
        var reader = new FileReader();
        reader.onload = function (e) {
            var img = new Image();
            img.onload = function () {
                var MAX_WIDTH = 1000;
                var MAX_HEIGHT = 1000;
                var width = img.width;
                var height = img.height;

                if (width > height) {
                    if (width > MAX_WIDTH) {
                        height *= MAX_WIDTH / width;
                        width = MAX_WIDTH;
                    }
                } else {
                    if (height > MAX_HEIGHT) {
                        width *= MAX_HEIGHT / height;
                        height = MAX_HEIGHT;
                    }
                }

                var canvas = document.createElement("canvas");
                canvas.width = width;
                canvas.height = height;
                canvas.getContext("2d").drawImage(this, 0, 0, width, height);
                var image = canvas.toDataURL();
                $("#uploadPictures").append(
                    $("<img>").addClass("img-thumbnail").attr("src", image).css("height", "100px")
                );
            };
            img.src = e.target.result;
        };
        reader.readAsDataURL(input.target.files[i]);
    }
});

Und hier der Upload:
Code:
$("#uploadSend").click(function(){
    var formData = new FormData($("#uploadForm")[0]);

    $.ajax({
        url: "/upload/add",
        type: "POST",
        xhr: function() {
            var progress = $.ajaxSettings.xhr();
            if(progress.upload){
                progress.upload.addEventListener("progress", function (e) {
                    if(e.lengthComputable){
                        $("#uploadProgress").attr("aria-valuenow", e.loaded).css("width", e.loaded+"%");
                    }
                }, false);
            }
            return progress;
        },
        beforeSend: function() {
            $("#uploadProgress").parent().removeClass("hidden");
            $("#uploadProgress").removeClass().addClass("progress-bar progress-bar-warning progress-bar-striped active");
        },
        success: function(data) {
            $("#uploadPictures").parent().addClass("hidden");
            $("#uploadPictures").empty();
            $("#storedPictures").parent().removeClass("hidden");
            var pictures = JSON.parse(data);
            for (i = 0; i < pictures.length; i++) {
                $("#storedPictures").append(
                    $("<img>").css("height", "100px").attr("src", "/images/einsaetze/" + pictures[i]).attr("data-file", pictures[i]).addClass("img-thumbnail img-delete")
                );
                $("#hiddenFields").append($("<input>").attr({type: "hidden", name: "bilder[]"}).val(pictures[i]));
            }
            $("#uploadProgress").removeClass().addClass("progress-bar progress-bar-success");
        },
        error: function(data) {
            var fehler = "Unbekannter Fehler!";
            if (data.status == 403) { fehler = "Keine Berechtigung!" }
            if (data.status == 415) { fehler = "Falsches Dateiformat!" }
            if (data.status == 500) { fehler = "Interner Serverfehler!" }
            $("#uploadPictures").empty();
            $("#uploadProgress").removeClass().addClass("progress-bar progress-bar-danger");
            alert("Es ist folgender Fehler aufgetreten: " + fehler);
        },
        data: formData,
        cache: false,
        contentType: false,
        processData: false
    });
});

Natürlich werden hier die Dateien aus dem Fileinput gesendet aber ich möchte die neu erstellten Dateien versenden.

Falls es euch weiterhilft hier der Link -> http://feuerwehr.ebelmxi.de/einsaetze/eintragen
Bitte vorher hier einloggen: http://feuerwehr.ebelmxi.de/intern/login
Benutzer: entwicklung
Passwort: entwicklung​

Ganz unten ist der Bildupload, einfach aufs PLUS klicken ;)
 
Habe mich noch ein bisschen umgesehen und habe beschlosse mein Upload Script nochmal zu überarbeiten.
Ich werde die ausgewählten Dateien dann direkt via ajax an den Server schicken, ist ja eigentlich unnötig nochmal extra auf Hochaden zu klicken. Ich habe sowieso schon implementiert das man das Bild vom Server löschen kann wenn man darauf klickt.

Ich werde das heute abend umsetzen und dann nochmal Bescheid geben.
 
Das Upload-Script ist jetzt eigentlich fertig.

Nur ein Problem tritt auf wozu ich keine Lösung finde, einige Bilder die im Hochformat vorliegen werden gedreht gerendert andere wiederum Richtig. Vermutlich ist bei denen Bildern die Orientation über metadata angegeben und das Bild selbst nicht gedreht. Wäre Wahnsinn wenn da jemand ne Lösung zu hat.
Link zum Testen ist schon in einem vorherigem Beitrag.

Auch wenn jemand Vorschläge zur Verbesserung hat kann er diese gerne einbringen ;)

Hier mein JS:
Code:
<script type="text/javascript">
    window.addEventListener("load", function() {

        $("#uploadFiles").change(function(input) {
            var maxWidth = 1000;
            var maxHeight = 1000;
            for (var i = 0; i < input.target.files.length; i++) {
                var reader = new FileReader();
                reader.onload = function (e) {
                    var image = new Image();
                    image.onload = function () {
                        if (image.width > image.height) {
                            image.height *= maxWidth / image.width;
                            image.width = maxWidth;
                        } else {
                            image.width *= maxHeight / image.height;
                            image.height = maxHeight;
                        }

                        var canvas = document.createElement("canvas");
                        canvas.width = image.width;
                        canvas.height = image.height;
                        canvas.getContext("2d").drawImage(image, 0, 0, image.width, image.height);

                        var formData = new FormData();
                        formData.append("image", canvas.toDataURL());

                        $.ajax({
                            url: "/upload/add",
                            type: "POST",
                            data: formData,
                            dataType: "json",
                            cache: false,
                            contentType: false,
                            processData: false,
                            xhr: function() {
                                var progress = $.ajaxSettings.xhr();
                                if(progress.upload){
                                    progress.upload.addEventListener("progress", function (e) {
                                        if(e.lengthComputable){
                                            $("#uploadProgress").attr("aria-valuenow", e.loaded).css("width", e.loaded+"%");
                                        }
                                    }, false);
                                }
                                return progress;
                            },
                            beforeSend: function() {
                                $("#uploadStatus").text("Bilder werden hochgeladen...");
                                $("#uploadProgress").removeClass().addClass("progress-bar progress-bar-warning progress-bar-striped active").parent().removeClass("hidden");
                            },
                            success: function(data) {
                                var storedURL = data.url;
                                $("#storedPictures").append(
                                    $("<li>").addClass("list-group-item").append(
                                        $("<img>").attr("src", "/images/einsaetze/" + storedURL).css({height: "100px", display: "inline-block"}),
                                        $("<button>").addClass("btn btn-danger pull-right removePicture").attr("data-file", storedURL).append(
                                            $("<i>").addClass("fa fa-trash")
                                        )
                                    )
                                );
                                $("#hiddenFields").append(
                                    $("<input>").attr({type: "hidden", name: "bilder[]"}).val(storedURL)
                                );

                                $("#uploadStatus").text("Erfolgreich!");
                                $("#uploadProgress").removeClass().addClass("progress-bar progress-bar-success").attr("aria-valuenow", "100").css("width", "100%");
                            },
                            error: function(data) {
                                $("#uploadStatus").text("Fehler: " + data.status);
                            }
                        });
                    };
                    image.src = e.target.result;
                };
                reader.readAsDataURL(input.target.files[i]);
            }
        });

        $(document).on("click", ".removePicture", function(e) {
            e.preventDefault();
            var element = $(this);
            var file = element.attr("data-file");
            $.ajax({
                url: "/upload/delete/" + file,
                type: "GET",
                success: function () {
                    $("input[value=\'"+ file +"\']").remove();
                    element.parent().remove();
                },
                error: function () {
                    alert("Datei konnte auf Server nicht gefunden werden!");
                }
            })
        });
    });
</script>

PS: Der Status der Progress-Bar ist auch nicht Optimal aber es zeigt an das was gemacht wird, das reicht in meinem Fall aus ;) aber auch hier dürft ihr gerne Vorschläge einbringen.


Schönen Feiertag Wünsche ich noch ;)
 
Zurück
Oben