[YandexDiskUploader] Загрузка файлов в Яндекс.Диск

  •    
Представляю YandexDiskUploader — небольшое дополнение, с помощью которого можно к любой форме добавить Ajax-загрузку файлов.

На фронтенде используется Dropzone JS. Внешний вид довольно легко кастомизируется — достаточно указать путь к CSS-файлу в соответствующей системной настройке.

Загрузка файлов осуществляется не в файловую систему сайта, а на Яндекс.Диск, доступ к которому нужно будет предоставить при установке дополнения. Сделать это достаточно однажды — токен сохраняется в системных настройках и используется в дальнейшем без всяких запросов.

Сниппет YandexDiskUploader выводит область для загрузки файлов. Расположить её можно в любом месте на странице — даже вне тега form. При вызове сниппета в параметре &inputId можно указать id инпута, в который после загрузки будет подставлена ссылка на папку в Диске с загруженными файлами. Эту ссылку можно отправить в письме или сохранить в базе данных. На странице дополнения есть пример добавления загрузки файлов в форму обратной связи.

Логику обработки ответа сервера можно переопределить, указав путь к JS-файлу в системной настройке.

Стоимость дополнения 290 руб. Приобрести можно как обычно, в магазине Modstore.pro:

modstore.pro/yandexdiskuploader
Илья Уткин
17 августа 2017, 16:56
modx.pro
5
3 550
+18
Поблагодарить автора Отправить деньги

Комментарии: 10

Дмитрий
17 августа 2017, 21:01
0
Круто! Спасибо!
    Василий Столейков
    18 августа 2017, 07:50
    0
    В input сохраняются прямые ссылки на файлы в облаке, или ссылки на страницу загрузки файла в Яндекс Диске?
      Илья Уткин
      18 августа 2017, 08:12
      +1
      В input сохраняется ссылка на папку внутри Яндекс.Диска. В этой папке будут лежать файлы, загруженные только текущим посетителем (сохраняется, пока не истечёт сессия):

    eivko
    24 октября 2017, 12:24
    0
    Очень полезная вещь! Во всю используем. Спасибо, Илья!
      Anton
      04 мая 2019, 21:23
      0
      День добрый.
      Возникла проблема на боевом сервере.
      Файлы успешно прикрепляются, в папке tmp на хостинге создается соответствующий по размеру временный файл, но на яндекс.диске файлы загруженные весят 0 байт, т.е. пустые…

      Такое впечатление, что сниппет просто создает файлы с указанным именем\расширением, но не копирует файлы.

      Ошибок ни js ни php никаких не выдает.

      На этой же базе данных, с этими же файлами на локальном сервере всё работает как часы.

      В какую сторону копать?

      Заранее спасибо!
        Илья Уткин
        06 мая 2019, 07:44
        0
        Здравствуйте. Напишите в поддержку, разберёмся.
          Anton
          06 мая 2019, 08:12
          0
          Здравствуйте, Илья.
          Спасибо за отклик и отличное дополнение!

          Проблему решили.
          Судя по всему проблема появилась после обновления на сервере библиотеки libcurl (было 7.62, стало 7.64.1)

          Необходимо было в сниппете добавить:
          curl_setopt($ch, CURLOPT_PUT, true);
          а перед этим согласно мануалу php еще и
          curl_setopt($ch, CURLOPT_INFILESIZE, filesize($_FILES[$inputId]['tmp_name']));
          итого у нас получилось:

          $ch = curl_init($response['href']);
                  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
                  curl_setopt($ch, CURLOPT_INFILE, fopen($_FILES[$inputId]['tmp_name'], 'r'));
                  curl_setopt($ch, CURLOPT_INFILESIZE, filesize($_FILES[$inputId]['tmp_name']));
                  curl_setopt($ch, CURLOPT_UPLOAD, true);
                  curl_setopt($ch, CURLOPT_POST, false);
                  curl_setopt($ch, CURLOPT_PUT, true);
                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                  curl_exec($ch);
                  curl_close($ch);
            Anton
            06 мая 2019, 08:15
            0
            Интересно, что

            В документации libcurl указано CURLOPT_PUT
            DESCRIPTION
            A parameter set to 1 tells the library to use HTTP PUT to transfer data. The data should be set with CURLOPT_READDATA and CURLOPT_INFILESIZE.
            This option is deprecated since version 7.12.1. Use CURLOPT_UPLOAD!


            Т.е. upload должен работать, а не put
            Но, нет…
          Anton
          06 мая 2019, 08:22
          0
          Может кому будет полезно:
          Ссылку на загруженный файл на Яндекс.Диске мы отправляли в письме менеджеру.
          Так вот в названии папки "MODX Яндекс.Диск" присутствует пробел и с ним были проблемы.
          Ссылка не открывалась или вела на 404 страницу.
          Поэтому пробел заменили на "MODX%20Яндекс.Диск"
          Но для этого сделали отдельную переменную и плейсхолдер.
          Т.к. сниппет наоборот с таким путём работать не сможет.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10