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

Vtiger 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 должны скачиваться корректно.

Популярное

Самые популярные посты

Как быть максимально продуктивным на удалённой работе?
Business

Как быть максимально продуктивным на удалённой работе?

Я запустил собственный бизнес и намеренно сделал всё возможное, чтобы работать из любой точки мира. Иногда я сижу с своём кабинете с большим 27-дюймовым монитором в своей квартире в г. Чебоксары. Иногда я нахожусь в офисе или в каком-нибудь кафе в другом городе.

Привет! Меня зовут Сергей Емельянов и я трудоголик
Business PHP

Привет! Меня зовут Сергей Емельянов и я трудоголик

Я программист. В душе я предприниматель. Я начал зарабатывать деньги с 11 лет, в суровые 90-е годы, сдавая стеклотару в местный магазин и обменивая её на сладости. Я зарабатывал столько, что хватало на разные вкусняшки.

Акция! Профессиональный разработчик CRM за 2000 руб. в час

Выделю время под ваш проект. Знания технологий Vtiger CRM, SuiteCRM, Laravel, Vue.js, Golang, React.js. Предлагаю варианты сотрудничества, которые помогут вам воспользоваться преимуществами внешнего опыта, оптимизировать затраты и снизить риски. Полная прозрачность всех этапов работы и учёт временных затрат. Оплачивайте только рабочие часы разработки после приемки задачи. Экономьте на платежах по его содержанию разработчика в штате. Возможно заключение договора по ИП. С чего начать, чтобы нанять профессионального разработчика на full-time? Просто заполните форму!

Telegram
@sergeyem
Telephone
+4915211100235