Загрузка изображения tinyMCE в каталог завершается неудачно, когда $ _POST ['imageDIR'] используется в postAcceptor.php - PullRequest
0 голосов
/ 19 мая 2018

Немного нового для tinyMCE и javascript.Хотелось бы понять, почему программа загрузки изображений php, предоставляемая сайтом tinyMCE, не работает, когда я пытаюсь использовать суперглобальный php $ _POST [] для ссылки на имя каталога.

$_POST['imageDIR'] - это каталог для хранения изображений при добавлении в текстовую область tinyMCE.Это работает, когда я использую $imageFolder = "images3/"; - изображения сохраняются в этом каталоге.Когда я использую $imageFolder = $_POST['imagesDIR'];, где значение $ _POST установлено в другом файле (например, 'images45 /'), каталог НЕ создается, а изображение сохраняется в текстовой области как строка изображения base64.

Попытка отразить что-либо в скрипте postAcceptor.php для устранения неполадок также приводит к той же ошибке.

Файл конфигурации tinyMCE показан ниже (прямо из примера сайта tinyMCE):

tinymce.init({
  selector: '#article',
  plugins: 'image code,autoresize',
  menubar:false,
  statusbar: false,
  toolbar: 'undo redo | link image | code',
  // enable title field in the Image dialog
  image_title: true, 
  // enable automatic uploads of images represented by blob or data URIs
  automatic_uploads: true,
  // URL of our upload handler (for more details check: https://www.tinymce.com/docs/configure/file-image-upload/#images_upload_url)
  images_upload_url: 'postAcceptor.php',
  // here we add custom filepicker only to Image dialog
  file_picker_types: 'image', 
  // and here's our custom image picker
  image_advtab: true,
  file_picker_callback: function(cb, value, meta) {
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('accept', 'image/*');

    // Note: In modern browsers input[type="file"] is functional without 
    // even adding it to the DOM, but that might not be the case in some older
    // or quirky browsers like IE, so you might want to add it to the DOM
    // just in case, and visually hide it. And do not forget do remove it
    // once you do not need it anymore.

    input.onchange = function() {
      var file = this.files[0];

      var reader = new FileReader();
      reader.onload = function () {
        // Note: Now we need to register the blob in TinyMCEs image blob
        // registry. In the next release this part hopefully won't be
        // necessary, as we are looking to handle it internally.
        var id = 'imageID' + (new Date()).getTime();
        var blobCache =  tinymce.activeEditor.editorUpload.blobCache;
        var base64 = reader.result.split(',')[1];
        var blobInfo = blobCache.create(id, file, base64);
        blobCache.add(blobInfo);

        // call the callback and populate the Title field with the file name
        cb(blobInfo.blobUri(), { title: file.name });
      };
      reader.readAsDataURL(file);
    };

    input.click();
  }

});

Файл postAcceptor.php показан ниже (также из примера сайта tinyMCE):

<?php
  /*******************************************************
   * Only these origins will be allowed to upload images *
   ******************************************************/
  $accepted_origins = array("http://localhost", "http://192.168.1.1", "http://example.com");

  /*********************************************
   * Change this line to set the upload folder *
   *********************************************/
  $imageFolder = "images3/"; //----WORKS!!!
  $imageFolder = $_POST['imagesDIR']; //--NO WORK!!! 
  /*********************************************/  

  if (!file_exists($imageFolder)) {
    mkdir($imageFolder, 0777, true);
}
  reset ($_FILES);
  $temp = current($_FILES);
  if (is_uploaded_file($temp['tmp_name'])){
    if (isset($_SERVER['HTTP_ORIGIN'])) {
      // same-origin requests won't set an origin. If the origin is set, it must be valid.
      if (in_array($_SERVER['HTTP_ORIGIN'], $accepted_origins)) {
        header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
      } else {
        header("HTTP/1.1 403 Origin Denied");
        return;
      }
    }

    /*
      If your script needs to receive cookies, set images_upload_credentials : true in
      the configuration and enable the following two headers.
    */
    // header('Access-Control-Allow-Credentials: true');
    // header('P3P: CP="There is no P3P policy."');

    // Sanitize input
    if (preg_match("/([^\w\s\d\-_~,;:\[\]\(\).])|([\.]{2,})/", $temp['name'])) {
        header("HTTP/1.1 400 Invalid file name.");
        return;
    }

    // Verify extension
    if (!in_array(strtolower(pathinfo($temp['name'], PATHINFO_EXTENSION)), array("gif", "jpg", "png"))) {
        header("HTTP/1.1 400 Invalid extension.");
        return;
    }

    // Accept upload if there was no origin, or if it is an accepted origin
    $filetowrite = $imageFolder . $temp['name'];
    move_uploaded_file($temp['tmp_name'], $filetowrite);

    // Respond to the successful upload with JSON.
    // Use a location key to specify the path to the saved image resource.
    // { location : '/your/uploaded/image/file'}
    echo json_encode(array('location' => $filetowrite));
  } else {
    // Notify editor that the upload failed
    header("HTTP/1.1 500 Server Error");
  }
?>

Любая помощь, объясняющая, почему переменная $_POST вызывает этот сбой, будет оценена.Любое предложение относительно того, как это можно сделать, поможет - моя конечная цель - сохранить изображения в каталоге, названном в честь идентификатора статьи, который хранится в базе данных.Идентификатор статьи изменяется в зависимости от того, какая статья вызывается из базы данных.Я также пытался использовать переменную $_SESSION['imagesDIR'], которая также не работала.

1 Ответ

0 голосов
/ 19 мая 2018

Использование $ _SESSION ['imageDIR'] сработало ... просто забыл использовать session_start () вверху файла!

$ _ POST Я думал, что можно использовать как переменную глобального массива, но, похоже,как будто вам нужно передать это на другие страницы, используя метод FORM / ACTION, и оно недоступно за пределами исходного скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...