Vtiger Customer Portal - устраняем проблему скачивания нулевого файла

Vtiger Customer Portal - устраняем проблему скачивания нулевого файла

В Customer Portal есть небольшой баг - при попытке скачивания файлов возникает ошибка, в результате которой пользователь получает файл нулевого размера. Баг воспроизводится не во всех случаях, а только при попытке скачивания файлов с некорректным синтаксисом в имени файла.

В Customer Portal есть небольшой баг - при попытке скачивания файлов возникает ошибка, в результате которой пользователь получает файл нулевого размера. Баг воспроизводится не во всех случаях, а только при попытке скачивания файлов с некорректным синтаксисом в имени файла. Тем не менее, его можно решить, внеся небольшие правки в файл modules/CustomerPortal/modules/CustomerPortal/apis/DownloadFile.php. Именно этот файл отвечает за поиск и передачу нужно файла в Customer Portal.

Итак, первое что вам нужно сделать, это найти следующие строчки в этом файле:

$filepathQuery = 'SELECT path,name FROM vtiger_attachments WHERE attachmentsid = ?';

$fileres = $adb->pquery($filepathQuery, array($fileid));

$filepath = $adb->query_result($fileres, 0, 'path');

$filename = $adb->query_result($fileres, 0, 'name');

$filename = decode_html($filename);

И эти строчки следует удалить, заменив на следующие:

$filepathQuery = 'SELECT path,name,storedname FROM vtiger_attachments WHERE attachmentsid = ?';

$fileres = $adb->pquery($filepathQuery, array($fileid));

$filepath = $adb->query_result($fileres, 0, 'path');

if($adb->query_result($fileres, 0, 'storedname')) { 

     $filename = $adb->query_result($fileres, 0, 'storedname');

} else {

     $filename = $adb->query_result($fileres, 0, 'name');

}

$realfilename = decode_html($adb->query_result($fileres, 0, 'name'));

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

Актуальное имя файла мы складываем в переменную realfilename. Теперь нам надо поменять переменную во всех местах использования, а именно, ищем следующие строчки (в районе 72):

$saved_filename = $fileid."_".$filename;

$filenamewithpath = $filepath.$saved_filename;

$filesize = filesize($filenamewithpath);

$fileDetails = array();

$fileDetails['fileid'] = $fileid;

$fileDetails['filename'] = $filename;

И меняем их на данный код:

$saved_filename = $fileid."_".$filename;

$filenamewithpath = $filepath.$saved_filename;

$filesize = filesize($filenamewithpath);

$fileDetails = array();

$fileDetails['fileid'] = $fileid;

$fileDetails['filename'] = $realfilename;

Также после 88 строчки ищем следующий код:

$fileid = $attachmentDetails['attachmentsid'];

$filename = $attachmentDetails['name'];

$filepath = $attachmentDetails['path'];

Меняем его на этот:

$fileid = $attachmentDetails['attachmentsid'];

$filename = $attachmentDetails['storedname'];

if(empty($filename)){

    $filename = $attachmentDetails['name'];

}

$filepath = $attachmentDetails['path'];

$realfilename = decode_html($attachmentDetails['name']);

И в районе 100 строки меняем строчку

$fileDetails['filename'] = $filename;

на эту:

$fileDetails['filename'] = $realfilename;

После проведения данных манипуляций, файлы с Customer Portal должны скачиваться корректно.