13

私はこのパッケージを使用しており、画像をアップロード、ドラッグ、並べ替え、ブラウザでプレビューできるように少し変更しました。アップロードは正常に機能し、画像の削除も行います。しかし、スクリプトが壊れるシナリオを見つけました。複数の画像があり、最初の画像を削除すると、削除した同じ画像をアップロードしようとすると、スクリプトが機能しなくなります。しかし、同じ画像をすぐにアップロードしようとせず、最初に別の画像をアップロードしてから、削除された画像をアップロードすると、機能します。また、コンソールにエラーは表示されません。これを修正する方法がわかりません。

私の完全なコードはこちらです。

これはコードの一部です:

$(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 コードを使用してフィドルを更新しましたが、残念ながら機能させることができなかったので、それがどれほど役立つかはわかりませんが、少なくとも完全なコードを見ることができます。画像をアップロードするページでこのスクリプトを使用しています。

<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;
}
4

3 に答える 3

0

私はあなたのコードの問題部分を救おうとしましたが、これを思いつきました( Fiddle )。

問題の部分はおそらくsuccess関数にあります。インデックスで要素を取得しようとする代わりに、success関数に渡された 2 番目の引数を使用します。

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 );
}

この問題は、現在アクセスできないサーバー側が原因である可能性もあります。

于 2016-11-12T13:37:26.193 に答える
0

同じタイプの問題があるJSイメージアップローダーも使用していました。ユーザーが画像をアップロードして削除し、同じ画像を再度アップロードすると、機能しません。だから私はそれを使用して修正しました:

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

画像削除イベントで。

于 2020-05-12T18:42:14.920 に答える
0

https://innostudio.de/fileuploader/に更新してみてください(jQuery.filer は Fileuploader に転送されました)

于 2017-04-19T10:29:19.573 に答える