Как мне на самом деле загружать и удалять файлы с помощью загрузчика ShieldUI и php?

Я пытаюсь создать модуль вложений для веб-сайта. Вот скрипт контроллера вложений Attachments.php

<?php
  class Attachments extends Controller {
    public function __construct(){

    }

    public function index(){
      $data = [
        'title' => 'Attachments',
        'description' => 'Area for attachments and uploads'
      ];

      $this->loadView('attachments/index', $data);
    }


    public function save(){
      $data = [
        'title' => 'Attachments',
        'description' => 'Area for attachments and uploads'
      ];
        $fileName = $_FILES['file']['name'];
        $fileTmpName = $_FILES['file']['tmp_name'];
        $fileSize = $_FILES['file']['size'];
        $fileError = $_FILES['file']['error'];
        $fileType = $_FILES['file']['type'];
        $fileExt = explode('.', $fileName);
      $fileActualExt = strtolower(end($fileExt));
        $fileNameNew = uniqid('',true).".".$fileActualExt;
        $fileDestination = '/app/attachments/'.$fileNameNew;
       if(move_uploaded_file($fileTmpName, $fileDestination)){
           return true;
       } else{
           return false;
       }
    }

public function remove($files){
      $data = [
        'title' => 'Attachments',
        'description' => 'Area for attachments and uploads'
      ];

            foreach($files as $file){
                $fileName = $file['fileName'];
                $filetoDel = $_SERVER['DOCUMENT_ROOT'] . '/app/attachments/' .$fileName;
            if (file_exists($filetoDel)) {
                unlink($file);
            } else {
                // File not found.
            }

            }
          }

  }

а вот вид вложений

<?php require APPROOT . '/views/inc/header.php'; ?>
  <div class="jumbotron jumbotron-flud text-center">
   <div class="session col-md-4 mx-auto">
       <?php echo flash('session_message');?>
   </div>
    <div class="container">
    <h1 class="display-3"><?php echo $data['title']; ?></h1>
    <p class="lead"><?php echo $data['description']; ?></p>
    </div>
   <div class="container">
    <div class="row">
       <form id="attatchments" method="post" enctype="multipart/form-data">
           <input id="files" type="file" name="files" />
           <input type="submit" name="save" value="Save"/>


       </form>

    </div>
</div>
<script>
 jQuery(function ($) {
        $('#files').shieldUpload({
            async: {
                enabled: true,
                save: {
                    url: "/attachments/save"
                },
                remove: {
                    url: "/attachments/remove"
                }
            }
        });
    });
      </script>
    </div>

<?php require APPROOT . '/views/inc/footer.php'; ?>

Скрипт, css и bootstrap указаны в файлах /views/inc/header.php /views/inc/footer.php.

URL-адрес сохранения должен запускать функцию сохранения, поскольку URL-адрес /attachments/save указывает загрузчику искать Attachments.php и загружать функцию save().

есть ли способ отладить это, поскольку при тестировании файл не сохраняется, однако, похоже, он запускает скрипт...

Я уже несколько недель ломаю голову, пытаясь понять, как заставить это работать. Я мог просто не использовать ShieldUI и сделать простой, однако я хотел бы использовать sheildUI для управления несколькими файлами. Кроме того, потому что я заплатил за лицензию разработчика, поэтому я предпочел бы использовать инструменты как можно больше.

Я выполнил поиск на Youtube, и все они, похоже, отдают предпочтение коду, который у меня есть в функции сохранения для загрузки отдельных файлов, и из документации компонент пользовательского интерфейса экрана передает каждый файл по одному, вызывая функцию сохранения для каждого файла?

-- Мне удалось заставить его работать, как указано ниже, для загрузки файлов. Однако я использую массив $_FILES. Это правильно или я должен передавать файл за раз из ShieldUI. Я не уверен, как это сделать? Теперь я изо всех сил пытаюсь найти способ удалить файлы.

Заранее большое спасибо за вашу помощь.


person timmac15    schedule 16.08.2018    source источник


Ответы (1)


Я отошел, поспал и вернулся к этому. Я подумал, что мне не нужен индексный файл для каждой из строк. Мне также нужно было использовать ../ вместо / в пути к файлу назначения. Моя функция сохранения в контроллере теперь выглядит так:

public function save(){
      $data = [
        'title' => 'Attachments',
        'description' => 'Area for attachments and uploads'
      ];

            foreach($_FILES as $file){
                $fileName = $file['name'];
                $fileTmpName = $file['tmp_name'];
                $fileSize = $file['size'];
                $fileError = $file['error'];
                $fileType = $file['type'];
                $fileExt = explode('.', $fileName);
                $fileActualExt = strtolower(end($fileExt));
                $fileNameNew = uniqid('',true).".".$fileActualExt;
                $fileDestination = '../app/attachments/'.$fileNameNew;
                   if(move_uploaded_file($fileTmpName, $fileDestination)){
                      return true;
                   } else{
                       return false;
                   }

            }

    }
person timmac15    schedule 17.08.2018