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