【问题标题】:Image preview script breaks on uploading the same image that was previously deleted图片预览脚本在上传之前删除的同一张图片时中断
【发布时间】:2016-10-10 03:46:15
【问题描述】:

我正在使用这个package,并对其进行了一些修改,以便我可以上传、拖动和排序图像并在浏览器中预览它们。上传工作正常,并删除图像。但是我发现了脚本中断的情况。当我有多个图像并且我删除了第一个图像时,尝试上传我删除的相同图像时,脚本不再起作用。但是,如果我不尝试立即上传相同的图像,而是先上传其他图像,然后再上传已删除的图像,那么它就可以了。另外,我在控制台中没有任何错误。我不确定如何解决这个问题。

我的完整代码是here

这是代码的一部分:

$(document).ready(function () {

    var imageCounter = 0;

    $('#articleForm').submit(function () {
        uploadPosition();
    });

    function uploadPosition() {
        var uploadedImagesPositions = [];
        $.each($('.jFiler-item-thumb-image'), function (index, value) {
            $(this).attr('data-position-index', index);
            uploadedImagesPositions[index] = $(this).find('img').attr('src');
        });

        if (!$('input[name="uploadedItems"]').length) {
            $('<input>', {
                type: "hidden",
                name: "uploadedItems"
            }).appendTo('#articleForm')
        }
        $('input[name="uploadedItems"]').val(JSON.stringify(uploadedImagesPositions));
        $("input[name^='jfiler-items-exclude-']:hidden").detach();
        console.log(uploadedImagesPositions);
    }

    $('#upload').filer({
        limit: null,
        maxSize: null,
        extensions: null,
        changeInput: '<div class="jFiler-input-dragDrop"><h1>+</h1></div>',
        showThumbs: true,
        appendTo: '.uploaded_items',
        theme: "default",
        templates: {
            box: '<div class="jFiler-item-list"></div>',
            item: '<div class="jFiler-item img-container dragdiv"></div>',
            itemAppend: '<div class="jFiler-item img-container dragdiv"></div>',
            progressBar: '<div class="bar"></div>',
            itemAppendToEnd: false,
            removeConfirmation: false,
            _selectors: {
                list: '.jFiler-item-list',
                item: '.jFiler-item',
                progressBar: '.bar',
                remove: '.jFiler-item-trash-action',
            }
        },
        uploadFile: {
            url: "/admin/articles/ajax",
            data: {
                '_token': $('input[name="_token"]').val()
            },
            type: 'POST',
            enctype: 'multipart/form-data',
            beforeSend: function () {},
            success: function (data, el) {
                uploadedImagesPositions = [];
                console.log(data);
                var filenameArray = data.split('/');
                var name = filenameArray.slice(-1).pop();
                var filename = name.replace(/[\/\s()]/g, '');

                var imageContainer = $('[data-jfiler-index="' + imageCounter + '"]').first();

                $('<div class="jFiler-item-thumb-image"><img src="/imagecache/thumb/' + filename + '"></div><div class="overlay"><a href="#"><span><i class="jFiler-item-trash-action ion-trash-a"></span></a></div>').appendTo(imageContainer);
                imageCounter++;

                $(".dragdiv").each(function () {
                    makeElementAsDragAndDrop($(this));
                });

                $('.images-refresh').hide();
                $('.images-refresh').click(function () {
                    $(this).closest("form").submit()
                });

                function makeElementAsDragAndDrop(elem) {
                    $(elem).draggable({
                        revert: "invalid",
                        cursor: "move",
                        helper: "clone"
                    });
                    $(elem).droppable({
                        activeClass: "ui-state-hover",
                        hoverClass: "ui-state-active",
                        drop: function (event, ui) {
                            uploadedImagesPositions = [];
                            $('.images-form a').hide();
                            $('.images-refresh').show();
                            var $dragElem = $(ui.draggable).clone().replaceAll(this);
                            $(this).replaceAll(ui.draggable);
                            makeElementAsDragAndDrop(this);
                            makeElementAsDragAndDrop($dragElem);
                        }
                    });
                }

                var parent = el.find(".jFiler-jProgressBar").parent();
                el.find(".jFiler-jProgressBar").fadeOut("slow", function () {
                    $("<div class=\"jFiler-item-others text-success\"><i class=\"icon-jfi-check-circle\"></i> Success</div>").hide().appendTo(parent).fadeIn("slow");
                });
            },
            error: function (el) {
                console.log(el);
                var parent = el.find(".jFiler-jProgressBar").parent();
                el.find(".jFiler-jProgressBar").fadeOut("slow", function () {
                    $("<div class=\"jFiler-item-others text-error\"><i class=\"icon-jfi-minus-circle\"></i> Error</div>").hide().appendTo(parent).fadeIn("slow");
                });
            },
            statusCode: {},
            onProgress: function () {},
        },
        dragDrop: {
            dragEnter: function () {},
            dragLeave: function () {},
            drop: function () {},
        },
        addMore: true,
        clipBoardPaste: true,
        excludeName: null,
        beforeShow: function () {
            return true
        },
        onSelect: function () {},
        afterShow: function () {},
        onRemove: function (el) {
            imageCounter = $('.img-container').size() - 1;
            //uploadPosition();
            //console.log(el.find('img').attr('src'));
        },
        onEmpty: function () {
            imageCounter = 0;
        },
        captions: {
            button: "Choose Files",
            feedback: "Choose files To Upload",
            feedback2: "files were chosen",
            drop: "Drop file here to Upload",
            removeConfirmation: "Are you sure you want to remove this file?",
            errors: {
                filesLimit: "Only {{fi-limit}} files are allowed to be uploaded.",
                filesType: "Only Images are allowed to be uploaded.",
                filesSize: "{{fi-name}} is too large! Please upload file up to {{fi-maxSize}} MB.",
                filesSizeAll: "Files you've choosed are too large! Please upload files up to {{fi-maxSize}} MB."
            }
        }
    });
});

更新

我已经用 HTML 和 CSS 以及 javascript 代码更新了fiddle,不幸的是,我无法让它工作,所以不确定它有多大帮助,但至少你可以看到完整的代码。 我在上传图片的页面上使用此脚本:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.min.js" integrity="sha384-I6F5OKECLVtK/BL+8iSLDEHowSAfUo76ZL9+kGAgTRdiByINKJaqTPH/QVNS1VDb" crossorigin="anonymous"></script>
<script type="text/javascript" src="{{ asset('js/foundation/foundation.min.js') }}"></script>
<script>$(document).foundation();</script>
<script type="text/javascript" src="{{ asset('js/jquery-ui/jquery-ui.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('js/jquery-filer/jquery-filer.js') }}"></script>

jquery-filer 是我用于上传的脚本,我正在使用的那个。

这是我用于 ajax 上传的服务器端功能。我在后端使用 PHP laravel:

public function ajaxUpload() {

    if (Input::hasFile('file')) {
        $files = Input::file('file');

        foreach ($files as $file) {
            $time = microtime(true);
            $name = $file->getClientOriginalName();
            $filename = $time.'-'.preg_replace('/[(\)\s]/u', '', $name);

            if(substr($file->getMimeType(), 0, 5) == 'image') {

                try {
                    $original = Image::make($file)->save(public_path($this->destinationPath.'/'.$filename));
                    \Log::info('try: '.$filename."\n");

                } catch (Exception $e) {
                    \Log::info('Caught exception: '.$e->getMessage(). "\n");
                }

                $img = Image::cache(function($image) use ($original){
                    return $image->make($original);
                });
            }
        }
    }

    return $this->destinationPath.$filename;
}

【问题讨论】:

  • 服务器或控制台是否有任何错误?
  • 不,我没有收到任何错误。
  • 删除时是否可能缓存图像?
  • 你能减少问题并制作一个遇到问题的小提琴吗?一个正在运行的小提琴是你找到解决方案的最短途径,我想你很想找到答案,因为你设置了一个赏金。因此,为我们做更多的工作,您将帮助自己获得更早的答案。
  • 请包含完整的工作示例,使用 html,最好是 css,并使用最少的代码来帮助检测代码的哪一部分可能有问题。现在看来,您为 filer 提供的选项过于臃肿,很难看出实际问题。

标签: javascript jquery jquery-filer


【解决方案1】:

我试图挽救您代码中的问题部分并提出了这个 (Fiddle)。

问题部分可能在success 函数中。不要尝试通过索引获取元素,而是使用传递给success 函数的第二个参数。

success: function(data, el) {
  uploadedImagesPositions = [];
  var filenameArray = data.split('/');
  var name = filenameArray.slice(-1).pop();
  var filename = name.replace(/[\/\s()]/g, '');

  // Instead of this
  // var imageContainer = $('[data-jfiler-index="' + imageCounter + '"]').first();

  // Use this
  var imageContainer = el;

  $('<div class="jFiler-item-thumb-image"><img src="/imagecache/thumb/' + filename + '"></div><div class="overlay"><a href="#"><span><i class="jFiler-item-trash-action ion-trash-a"></span></a></div>').appendTo(imageContainer );
}

问题也可能是您的服务器端引起的,我们目前无法访问。

【讨论】:

  • 我已经尝试过你的建议,但我一直得到同样的东西,我只是不能在删除后立即上传相同的图像,只有我先上传一些其他图像,然后我才能上传同样的。而且,当我尝试再次上传已删除的图像时,这不是第一次发生,它是第一次工作,但是在第一张之后的每张图像之后,我不能立即再次上传相同的图像先删除
  • @Marco 什么不适合你?您预期会发生什么以及实际发生了什么?您可以确认文件是在服务器上创建的,还是在选择文件时运行服务器端代码?我还要求您修剪代码,但您添加了更多代码。
  • 对不起,我不知道在哪里修剪,因为我不知道代码的哪一部分导致了这个问题。我可以确认在服务器端一切正常。我在上传时预览图像,效果很好,我还有一个功能,我可以在预览中删除图像,而且效果也很好,唯一的问题是如果我删除了一些图像,我不能立即再次上传同样的一张,我需要先上传一些其他的图片,然后我可以再次上传同样的一张。
  • @Marco 是的,但你为什么认为你不能上传图片?前端预览不显示吗?图片不是在服务器端生成的吗?有错误信息吗?你一直告诉它不工作,但必须有一些东西表明它不工作。要修剪代码,首先尝试使用jQuery.filer 的默认设置,没有模板和所有装饰性的东西。例如,在选项中分配null,这些完全没用。
【解决方案2】:

尝试更新到https://innostudio.de/fileuploader/(jQuery.filer 已转移到 Fileuploader)

【讨论】:

    【解决方案3】:

    我还使用了一个 JS 图像上传器,它具有相同类型的问题。当用户上传一张图片并删除它并再次上传同一张图片时,它不起作用。 所以我修复了它:

    $('input[type="file"]').val(null);

    在图片删除事件中。

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 2021-04-23
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2019-06-16
      • 2014-01-13
      相关资源
      最近更新 更多