Arhn - архитектура программирования

Laravel 5.2 и Dropzone.js - Удалить (удалить) загруженные изображения

В route.php у меня есть следующие маршруты:

Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoController@dropzoneUpload']);
Route::post('dropzone/delete', ['as' => 'dropzone.delete', 'uses' => 'AdminPhotoController@dropzoneDelete']);

В AdminPhotoController.php я сделал следующее:

public function dropzoneUpload(Request $request)
{
    if($request->ajax()) {  // hmm, do I really need this?
        if ($request->hasFile('file') && $request->file('file')->isValid()) {
            $image_file = $request->file('file');
            $image_name = time() . '_' . $image_file->getClientOriginalName();
            $destinationPath = 'images/photos';

            if ($image_file->move($destinationPath, $image_name)) {
                $photo = new Photo(['file_name' => $image_name, 'title' => 'No title', 'description' => 'No description']);
                \Auth::user()->photos()->save($photo);

                return \Response::json('success', 200);
            } else {
                return \Response::json('error', 400);
            }
        }
    }
}

Наконец, вот мой HTML и JS:

<div class="dropzone" id="dropzoneFileUpload">
</div>

<script type="text/javascript">

    Dropzone.autoDiscover = false; // to disable the auto discover behaviour of Dropzone (sami ga definisemo ispod)

    var myDropzone = new Dropzone("div#dropzoneFileUpload", {
        url: "{{ route('dropzone.upload') }}",
        headers: {
            'X-CSRF-TOKEN': '{!! csrf_token() !!}'
        }
    });

</script>

И это работает, загрузка файлов работает. Но я хотел бы иметь удалить ссылки для удаления загруженных изображений. Я читал официальную документацию на http://www.dropzonejs.com/, но до сих пор не понимаю как это сделать. Я вижу, что есть:

  • событие removefile — вызывается всякий раз, когда файл удаляется из списка. Вы можете прослушать это и удалить файл со своего сервера, если хотите;
  • и метод .removeFile(file). Если вы хотите удалить добавленный файл из зоны сброса, вы можете вызвать .removeFile(file). Этот метод также вызывает событие removefile.

Итак, я начал так, но я не знаю, как это сделать, как удалить эти изображения:

    Dropzone.options.dropzoneFileUpload = { // div has id=dropzoneFileUpload?
        addRemoveLinks: true,  // but still link to delete is not displayed?
        dictRemoveFile: 'Remove'
    };

    myDropzone.on("complete", function(file) {
        myDropzone.removeFile(file); // What should I do here?
    });

.


ИЗМЕНИТЬ:

Если я удалю этот код:

    Dropzone.autoDiscover = false;

    var myDropzone = new Dropzone("#my-dropzone", {
        url: "{{ route('dropzone.upload') }}",
        headers: {
            'X-CSRF-TOKEN': '{!! csrf_token() !!}'
        }
    });

решение, которое дал @Manuel Azar, будет работать, теперь отображаются ссылки для удаления (для каждого загруженного изображения). Значит, с этим кодом какая-то проблема, чего-то не хватает.


Ответы:


1

Взгляните на этот ответ, чтобы помочь вам понять события dropzone:

https://stackoverflow.com/a/19454507/4734404

Затем вы должны добавить действие в свой контроллер для вашего запроса на удаление, чтобы удалить изображение из БД и диска:

public function dropzoneRemove(Request $request)
{
    if($request->ajax()) { 
        $photo = Photo::find($request->photoId); //Get image by id or desired parameters

        if(File::exists($destinationPath.$photo->file_name)) //Check if file exists
            File::delete($destinationPath.$photo->file_name) //Delete file from storage
            
        $photo->delete()   //Delete file record from DB

        return response('Photo deleted', 200); //return success
    }
}

Я бы порекомендовал вам взглянуть на фасад Laravel Storage, чтобы ваши файлы были хорошо организованы в вашей файловой системе.

https://laravel.com/docs/5.2/filesystem

ИЗМЕНИТЬ:

Как добавить кнопку для удаления предварительного просмотра каждого файла?

Начиная с версии Dropzone 3.5.0, есть опция, которая сделает все это за вас: addRemoveLinks. Это добавит элемент «Удалить файл» к предварительному просмотру файла, который удалит файл, и он изменится на «Отменить загрузку», если файл в данный момент загружается (это вызовет диалоговое окно подтверждения).

Вы можете изменить эти предложения с помощью параметров dictRemoveFile, dictCancelUpload и dictCancelUploadConfirmation.

Если вы все еще хотите создать кнопку самостоятельно, вы можете сделать это следующим образом:

<form action="/target-url" id="my-dropzone" class="dropzone"></form>

<script>
    // myDropzone is the configuration for the element that has an id attribute
    // with the value my-dropzone (or myDropzone)
    Dropzone.options.myDropzone = {
        init: function() {
            this.on("addedfile", function(file) {

                // Create the remove button
                var removeButton = Dropzone.createElement("<button>Remove file</button>");


                // Capture the Dropzone instance as closure.
                var _this = this;

                // Listen to the click event
                removeButton.addEventListener("click", function(e) {
                    // Make sure the button click doesn't submit the form:
                    e.preventDefault();
                    e.stopPropagation();

                    // Remove the file preview.
                    _this.removeFile(file);
                    // If you want to the delete the file on the server as well,
                    // you can do the AJAX request here.
                });

                // Add the button to the file preview element.
                file.previewElement.appendChild(removeButton);
            });
        }
    };
</script>

Из часто задаваемых вопросов: https://github.com/enyo/dropzone/wiki/FAQ#how-to-add-a-button-to-remove-each-file-preview

Подробнее о настройке свойств dropzone здесь: http://www.dropzonejs.com/#layout.

ИЗМЕНИТЬ 2

Проблема здесь:

Dropzone найдет все элементы формы с классом dropzone, автоматически прикрепится к нему и загрузит сброшенные в него файлы на указанный атрибут действия. http://www.dropzonejs.com/#usage

В качестве альтернативы вы можете создавать зоны сброса программно (даже на элементах, не являющихся элементами формы), создав экземпляр класса Dropzone http://www.dropzonejs.com/#create-dropzones-programmatically

Dropzone.autoDiscover = false; // to disable the auto discover behaviour of Dropzone (sami ga definisemo ispod)

var myDropzone = new Dropzone("div#dropzoneFileUpload", {

Я полагаю, что у вас есть два экземпляра Dropzone, потому что вы создаете еще один объект Dropzone. Вы должны придерживаться быстрой настройки и редактировать параметры напрямую, а также удалить autoDiscover = false, а не делать это программно.

если идентификатор вашего элемента dropzone — «my-awesome-dropzone»:

<form action="/file-upload"class="dropzone" id="my-awesome-dropzone"></form>

Dropzone автоматически создаст свойство с верблюжьим идентификатором «myAwesomeDropzone» и прикрепит его к текущему объекту.

Итак, вы устанавливаете параметры Dropzone, выполняя:

//myAwesomeDropzone = camelized version of ID = my-awesome-dropzone
Dropzone.options.myAwesomeDropzone = { 
    addRemoveLinks: true
}

Я сделал этот плункер с настройкой minimun для вас, просто добавьте конфигурацию вашего запроса, как вы делали раньше, и он должен работать, я установил для addRemoveLinks значение true, чтобы вы могли видеть, что они работают:

https://plnkr.co/edit/9850jCOpTwjSSxI1wS1K?p=info

22.07.2016
  • У меня даже не отображаются ссылки для удаления... У меня есть addRemoveLinks: true, dictRemoveFile: 'Remove' , но после загрузки изображения отображается миниатюра, но без ссылки для удаления. 22.07.2016
  • Это может быть проблема с версией, какую версию dropzone.js вы используете? и, пожалуйста, укажите любые консольные ошибки, если они есть в тот момент, когда вы пытаетесь удалить файл. Проверьте источник html, чтобы увидеть, отображаются ли ссылки для удаления. 22.07.2016
  • Я использую последнюю версию, загруженную отсюда: github.com/enyo/dropzone/releases. /tag/v4.3.0 Ошибок консоли нет. Я проверил источник HTML и не удалял ссылки, они не отображаются. 22.07.2016
  • пожалуйста, проверьте мой обновленный ответ, надеюсь, он сработает для вас, если нет, я все еще здесь, чтобы помочь. 23.07.2016
  • Это работает, но только если я удалю первую часть своего кода (см. мое EDIT в начальном вопросе). Чего-то там не хватает, и если я использую этот код - ссылки на удаление отображаться не будут. В любом случае, если вы видите, в чем проблема, скажите, если нет, я все равно проверю ваш ответ как правильный. Спасибо. 23.07.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..