0

在这里向大家问好!

首先,我搜索了重复的帖子,但没有发现类似我的问题。

我正在做一些测试(你会在我的代码中看到一些重复)以使用引导文件输入上传多个文件,我在使用缩略图预览上的“删除”按钮时遇到了一些问题。

上传功能工作正常,如果存在带有 initialPreview 选项的图像,则显示已上传的图像。

我正在尝试动态创建 intialPreviewConfig 选项,目前我不知道它为什么不起作用(单击“删除”按钮根本没有任何操作,就像该选项不存在一样)。但是,当我手动添加 intialPreviewConfig(不在变量中)时,它神奇地工作正常。

示例 javascript 代码(我的真实代码中的某些值不同):


    var e = 'http://localhost/foo/';

// Where other_prev is an array of img
// Where other_images_path is an array of paths to images
var other_prev = ['...'];
var other_images_path = ['...'];

var uploadOtherFileInput = function ($input) {

            console.log(other_prev); // Okay : array with img tags
            console.log(other_images_path); // Okay : array with urls to images

            var id_to_upload;

                        // If id already exists
            if($('#id').length) {
                id_to_upload = $('#id').val();
            } else {
                id_to_upload = $('#id_to_upload').val();
            }

            // Construct initial preview config for deleting images
            var initialPreviewConfig = [];

            if(Array.isArray(other_images_path)) {
                var xhr;

                // Convert paths of images to blob objects
                for(var i = 0; i < other_images_path.length; i++) {
                    (function (i) {
                        xhr = new XMLHttpRequest();
                        xhr.open('GET', other_images_path[i], true);
                        xhr.responseType = 'blob';
                        xhr.onload = function (ev) {
                            if (this.status == 200) {
                                var blobFile = this.response;
                                var splitted_path = other_images_path[i].split('/');
                                var img_name = splitted_path[splitted_path.length - 1];
                                blobFile.name = img_name;
                                initialPreviewConfig.push({
                                    "caption": img_name,
                                    "size": blobFile.size,
                                    "url": e + 'ajax/delete_image',
                                    "key": i + 1
                                });
                            }
                        };
                        xhr.send();
                    }).call(this, i);
                }
            }

            // Console log is working
            console.log(initialPreviewConfig);

                        // Making the bootstrap fileinput
            // Working fine to show previews and upload new images
            // Not working for initialPreviewConfig to delete images
            $input.fileinput({
                language: 'fr',
                allowedFileExtensions: ["jpg", "jpeg", "png"],
                uploadUrl: e + 'ajax/upload_image_sup',
                uploadAsync: false, // Permet d'obtenir toutes les images en une fois et d'attendre la fin
                minFileCount: 0,
                maxFileCount: 20,
                resizeImage: true,
                showClose: false,
                showCaption: false,
                showBrowse: true,
                showUpload: false,
                showUploadedThumbs: false,
                showPreview: true,
                uploadExtraData: function () {
                    var out = {};
                    out.id = id_to_upload;
                    return out;
                },
                layoutTemplates: {
                    footer: '<div class="file-thumbnail-footer">\n' +
                            '    <div class="file-caption-name" style="width:{width}">{caption}</div>\n' +
                            '    {actions}\n' +
                            '</div>',
                    actions: '<div class="file-actions">\n' +
                            '    <div class="file-footer-buttons">\n' +
                            '        {delete} {zoom}' +
                            '    </div>\n' +
                            '    {drag}\n' +
                            '    <div class="file-upload-indicator" title="{indicatorTitle}">{indicator}</div>\n' +
                            '    <div class="clearfix"></div>\n' +
                            '</div>'
                },
                initialPreviewFileType: 'image',
                initialPreview: other_prev,
                initialPreviewConfig: initialPreviewConfig
            });


                        // Okay it's a repeat thing but it's just for test purposes
            if(Array.isArray(other_images_path)) {
                var xhr;

                for(var i = 0; i < other_images_path.length; i++) {
                    (function (i) {
                        xhr = new XMLHttpRequest();
                        xhr.open('GET', other_images_path[i], true);
                        xhr.responseType = 'blob';
                        xhr.onload = function (e) {
                            if (this.status == 200) {
                                var blobFile = this.response;
                                var splitted_path = other_images_path[i].split('/');
                                var img_name = splitted_path[splitted_path.length - 1];
                                blobFile.name = img_name;
                                // Add preview to stack for overwrite
                                $input.fileinput('addToStack', blobFile);
                            }
                        };
                        xhr.send();
                    }).call(this, i);
                }
            }
        };

other_prevother_images_path的控制台日志可以创建预览。

现在变量 initialPreviewConfig 的控制台日志是(宽度不存在,但我删除了它,没有变化):

[]
0: {caption: "xxx.jpeg", size: 381939, url: e + "ajax/delete_image", key: 1}
1: {caption: "yyy.jpeg", size: 381939, url: e + "ajax/delete_image", key: 2}
2: {caption: "zzz.jpeg", size: 381939, url: e + "ajax/delete_image", key: 3}
3: {caption: "aaa.jpeg", size: 381939, url: e + "ajax/delete_image", key: 4}
4: {caption: "bbb.JPG", size: 2442700, url: e + "ajax/delete_image", key: 5}
length: 5
__proto__: Array(0)

所以一切似乎都很好......但这不适用于删除。但是,如果我手动创建配置,它的工作“正常”(目前未创建 ajax/delete_image 路由,但单击正常,我收到错误消息)。

示例(此处的值并不重要):

...
initialPreviewFileType: 'image',
initialPreview: other_prev,
initialPreviewConfig: [
    {caption: "xxx.jpg", size: 576237, width: "120px", url: e + "ajax/delete_image", key: 1},
{caption: "yyy.jpg", size: 576237, width: "120px", url: e + "ajax/delete_image", key: 2},
...
]
...

有人可以帮助我解决这个问题或面临/面临同样的问题吗?如果您想要更多示例或 JSFiddle,请告诉我。

对于这个测试,我正在使用:

  • 带有框架 CodeIgniter 3 的 PHP 5.6
  • 铬 75
  • 引导程序 3.3.7
  • jQuery 3.1.1
  • 引导文件输入 4.4.3

我也可以使用 jQuery ($.ajax, $.get...) 而不是 XMLHttpRequest 但这不是我认为的问题。

谢谢!再会!

4

1 回答 1

0

好的,所以它一如既往地是一个异步问题。

它可以通过多种方式解决,如承诺或回调函数,但为了与代码保持一致,我现在在加载页面之前从服务器创建对象数组(如 initialPreview 缩略图)。

带来不便敬请谅解!

于 2019-08-09T09:52:24.927 回答