Dropzone загрузить все в одном массиве с использованием сериализации

1

Проблема заключается в том, что каждый раз, когда я нажимаю кнопку "Загрузить", чтобы сохранить все изображения в базе данных, она будет сохраняться одна за другой. Пример: я загружаю два изображения в dropzone и отправляю их. Данные будут сохранены в базе данных, это два столбца, которые неправильны, что я хочу отобразить, это только один столбец с несколькими изображениями. Надеюсь, вы сможете помочь мне в этом. Спасибо, вперед!

Код Dropzone js:

Dropzone.options.myDropzone = {

  // Prevents Dropzone from uploading dropped files immediately
  autoProcessQueue: false,

  init: function() {
    var submitButton = document.querySelector("#submit-all")
        myDropzone = this; // closure

    submitButton.addEventListener("click", function() {
      myDropzone.processQueue(); // Tell Dropzone to process all queued files.
    });

    // You might want to show the submit button only when 
    // files are dropped here:
    this.on("addedfile", function() {
      // Show submit button here and/or inform user to click it.
    });

  }
};

HTML:

<button id="submit-all">Submit all files</button>
<form action="upload.php" class="dropzone" id="my-dropzone"></form>

Мой PHP-код:

<?php
if(!empty($_FILES)){

        $targetDir = "../drop/../images/";
        $fileName = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
        $img = $_FILES['file']['name'];
        $img_name = $id . "_" . uniqid() . "_" . ($_POST['default_pic'] == $img ? "1" : "0") . "." . $fileName;
        $targetFile = $targetDir.basename($img_name);

        if (move_uploaded_file($_FILES['file']['tmp_name'],$targetFile)){

            $new_data = array("cover" => ($_POST['default_pic'] == $img ? "1" : "0"), "img" => $img_name); 
            $new_array[] = $new_data;

            $data_serialize = serialize($new_array);
            //insert file information into db table
            $mysqli->query("INSERT INTO files (file_name, uploaded) VALUES('".$data_serialize."','".date("Y-m-d H:i:s")."')");
            //$new_id = $mysqli->insert_id;
    }

}
?>
  • 0
    Я предполагаю, что вы имеете в виду одну строку. Можете ли вы объяснить более подробно, каким образом файлы должны храниться в базе данных?
  • 0
    @wallek876 wallek876 Он должен сохраняться в базе данных в одном идентификаторе с несколькими изображениями, поэтому я использовал сериализованную функцию, чтобы объединить их все в один идентификатор. посмотрите этот правильный выходной образец. а: 2: {я: 0; а: 2: {s: 5: "крышка"; s: 1: "1"; s: 3: "IMG"; s: 22: "17_55d58456570d5_1.jpg";} я : 1; a: 2: {s: 5: "cover"; s: 1: "0"; s: 3: "img"; s: 22: "17_55d5845706396_0.jpg";}} <- этот вывод должен сохранено в базе данных не только одно изображение
Показать ещё 5 комментариев
Теги:
dropzone.js

1 ответ

1
Лучший ответ

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

uploadMultiple: true

Таким образом, файлы будут загружаться вместе как массив.

Пример:

Dropzone.options.myDropzone = {
    autoProcessQueue: false,
    uploadMultiple: true,
    init: function () {
        var submitButton = document.querySelector("#submit-all");
        myDropzone = this; 
        submitButton.addEventListener("click", function () {
            myDropzone.processQueue(); 
        });
        this.on("success", function(file){
            console.log(file.xhr.response);
        });
    }
};

Как только на стороне сервера вы неправильно $_FILES переменную $_FILES, я не буду здесь объяснять, как работает $_FILES, но вот несколько интересных ссылок: 1, 2.

Так как '$ _FILES - это многомерный массив с неинтуитивной структурой, вам нужно несколько циклов прокручивать его, чтобы выполнить то, что вы пытаетесь сделать.

Вот пример на стороне сервера, я просто закодировал некоторые значения, потому что я действительно не знаю, какими они должны быть. также печатная информация - это просто увидеть в консоли браузера процесс:

<?php
    if(!empty($_FILES)){
        // Harcoded values
        $id=99;
        $_POST["default_pic"] = $_FILES["file"]["name"][0];

        print("ORIGINAL STRUCTURE OF \$_FILES:\n");
        print_r($_FILES);
        $myfiles = array();
        foreach(array_keys($_FILES["file"]['name']) as $i) { // loop over 0,1,2,3 etc...
            foreach(array_keys($_FILES["file"]) as $j) { // loop over 'name', 'size', 'error', etc...
                $myfiles[$i][$j] = $_FILES["file"][$j][$i]; // "swap" keys and copy over original array values
            }
        }
        print("RESULT STRUCTURE OF THE MANIPULATED \$_FILES:\n");
        print_r($myfiles);
        $targetDir = "../drop/../images/";
        $myimages = array();

        foreach($myfiles as $single_image) {
            $extension = pathinfo($single_image["name"], PATHINFO_EXTENSION);
            $img = $single_image["name"];
            $img_name = $id . "_" . uniqid() . "_" . ($_POST['default_pic'] == $img ? "1" : "0") . "." . $extension;
            $targetFile = $targetDir.basename($img_name);
            if (move_uploaded_file($single_image["tmp_name"], $targetFile)){
                $myimages[] = array("cover" => ($_POST['default_pic'] == $img ? "1" : "0"), "img" => $img_name);
            }
        }
        $data_serialize = serialize($myimages);
        print("SERIALIZED DATA:\n");
        print($data_serialize);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню