сжатие нескольких изображений со стороны клиента перед загрузкой на сервер с использованием библиотеки JI C - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь загрузить несколько изображений с предварительным просмотром и немедленно сжать их, но он все равно загружается на сервер без сжатия, я запутался в том, что я делаю не так, пожалуйста, помогите) очень ценю вот мой код:

var output_format = 'jpg';
    $(document).ready(function () {
        if (window.File && window.FileList && window.FileReader) {

            $("#files").on("change", function (e) {
                var jic = {
                    compress: function(source_img_obj, quality, output_format){

                        var mime_type = "image/jpeg";
                        if(typeof output_format !== "undefined" && output_format=="png"){
                            mime_type = "image/png";
                        };

                        var cvs = document.createElement('canvas');
                        cvs.width = source_img_obj.naturalWidth;
                        cvs.height = source_img_obj.naturalHeight;
                        var ctx = cvs.getContext("2d").drawImage(source_img_obj, 0, 0);
                        var newImageData = cvs.toDataURL(mime_type, quality/100);
                        var result_image_obj = new Image();
                        result_image_obj.src = newImageData;
                        return result_image_obj;
                    },
                }
                    var files = e.target.files;

                    for (var i = 0; i < files.length; i++) {
                        var f = files[i];
                        var fileReader = new FileReader();
                        fileReader.onload = (function (e) {
                            $("#mainPicturesContainer").append("<div class=\"puctureContainer\">" +
                                "<img id=\"source_image\"  src=\"" + e.target.result + "\" class=\"projectPictures\" style=\"height: inherit\">" +
                                "<div class=\"editPanel\">" +
                                "<button type=\"button\" onclick=\"deleteRestorePicture(this)\">Удалить</button>" +
                                "</div>" +
                                "</div>");



                        });
                        fileReader.readAsDataURL(f);
                        var quality = 30;
                        var text = document.getElementById("source_image");
                        f.src = jic.compress(text, quality, output_format );

                    }
                    $("#infoAboutPictures").innerHTML = "";
                }

            );
        } else {
            alert("Your browser doesn't support to File API")
        }
    });

1 Ответ

0 голосов
/ 24 апреля 2020

Вам нужно переместить 3 строки внутри обратного вызова onload() для программы чтения файлов, потому что в противном случае сжатие запустится немедленно, пока программа чтения файлов не прочитает файл

for (var i = 0; i < files.length; i++) {
    var f = files[i];
    var fileReader = new FileReader();
    fileReader.onload = (function (e) {
        $("#mainPicturesContainer").append("<div class=\"puctureContainer\">" +
            "<img id=\"source_image\"  src=\"" + e.target.result + "\" class=\"projectPictures\" style=\"height: inherit\">" +
            "<div class=\"editPanel\">" +
            "<button type=\"button\" onclick=\"deleteRestorePicture(this)\">Удалить</button>" +
            "</div>" +
            "</div>");

        var quality = 30;                                   //1
        var text = document.getElementById("source_image"); //2
        f.src = jic.compress(text, quality, output_format );//3

    });
    fileReader.readAsDataURL(f);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...