Медиафайлы Virtuemart теряют всю мета-информацию при загрузке - PullRequest
0 голосов
/ 24 мая 2019

Мои медиа-файлы теряют всю мета-информацию при загрузке. У меня есть сайт с загружаемыми виртуальными продуктами. Это влияет на файлы приложений Android, apk's.

Если я хочу загрузить и установить файлы, я получаю следующую ошибку.

При синтаксическом анализе пакета произошла ошибка.

Пакет загрузки (apk) не включает номер версии, размер файла, имя пакета. Показывает только N / A.

Сценарий:

  • Я скачал файл apk напрямую через ftp из папки с файлами vmfiles. Метаданные доступны - установка в порядке.

  • Сайт загрузки - Файл не включает номер версии, размер файла, имя пакета. Установка завершается с сообщением выше.

Я работаю с:

  • VirtueMart 3.2.15 Blue Corvus 9877
  • Joomla 3.8.7
  • OpenTools Virtuemart Скачать плагин для продажи

Я переключил базу данных на utf8mb4, потому что мне нужны символы в тексте и описании. С тех пор загруженные продукты, вероятно, не пригодны для использования.

Я изменил поля varchar, varchar (191) или изменил их на текстовые. Я просто не знаю почему, как и где теряется информация о пакете.

Вот еще один запрос phpmyadmin mysql для переменных / параметров сортировки:

SHOW VARIABLES LIKE 'char%'

--------------------
Web server productive:
-------------------------------------
variable_name value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8
character_set_system utf8
character_sets_dir / usr / share / mysql / charsets /

----------
Local Host:
-------------------------------------
Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C: \ xampp \ mysql \ share \ charsets \

Я уже приобрел программное обеспечение у OpenTools в феврале 2016 года. Программное обеспечение больше не поддерживается. Может быть, я могу связаться с кем-то на форуме или по электронной почте. Как я уже сказал, загруженные файлы на сервере все еще в порядке. А загружаемое программное обеспечение считывает поток файлов через байты readfile_chunked для ссылки на скачивание.

Может быть, какая-то base64 или что-то здесь должно быть закодировано? Или ошибка где-то еще?

Android Studio сообщает при открытии загруженного файла .apk:

Неизвестный тип чанка: 835 java.lang.NullPointerException: неизвестный тип чанка: 835

Virtuemart работает с utf8, mysql поддерживает Multi (utf8 + utf8mb4). Моя система настроена с utf8mb_unicode_ci.

Должен ли я переключиться на кодировку соединения utf8mb4_bin? Virtuemart понимает это? Я обязательно попробую сейчас.

Я нашел другой фрагмент кода, касающийся mysql_encoding:

utf8mb4 здесь отсутствует:

switch($mysql_encoding[0])
{
    case "utf8":
        return "utf-8";
        break;
    case "latin1":
        return "iso-8859-1";
        break;
    default:
        return $mysql_encoding[0];
}

Должна ли такая вещь быть взята с собой в модель Virtuemart? Где-то я читал что-то из двоичных переменных Java специально для обработки вызовов utf8mb4. Это вы должны настроить это дополнительно. Кроме того, прикрепление? UseUnicode = true & characterEncoding = UTF-8 'для ссылки на скачивание URL JDBC не помогло.

1 Ответ

1 голос
/ 24 мая 2019

Бог кодирования на другом форуме мог бы помочь мне в дальнейшем и нашел решение :-) В используемом запросе readfile_chunked, удаляется ли здесь выходной буфер.Решением было поставить ob_clean () перед циклом while.

function readfile_chunked($filename, $retbytes=true)
{
    $ chunksize = 1 * (1024 * 1024); // how many bytes by chunk
    $ buffer = '';
    $ cnt = 0;
                    
    $ handle = fopen ($ filename, 'rb');

    if ($ handle === false) 
    {
       return false;
    }
    ob_clean ();

    while (! feof ($ handle)) 
    {
       $ buffer = fread ($ handle, $ chunksize);
       echo $ buffer;
       ob_flush ();
       flush ();
                           
       if ($ retbytes) 
       {
          $ cnt + = strlen ($ buffer);
       }
    }                  
    $ status = fclose ($ handle);

    if ($ retbytes && $ status) 
    {
       return $ cnt; // return num. bytes delivered like readfile () does.
    }                   
    return $ status;
}
...