国外的CMS系统一大问题就是上传中文附件。要么不支持上传,要么传上去不支持链接。
Joomla使用jce可以解决这个问题。
通过jce上传文件时,自动重命名,去掉中文即可。
在Joomla\components\com_jce\editor\libraries\classes\browser.php中,将upload函数中$name 重命名。
/**
* Upload a file.
* @return array $error on failure or uploaded file name on success
*/
public function upload() {
// Check for request forgeries
WFToken::checkToken() or die();
// check for feature access
if (!$this->checkFeature('upload')) {
JError::raiseError(403, 'Access to this resource is restricted');
}
$filesystem = $this->getFileSystem();
jimport('joomla.filesystem.file');
header('Content-Type: text/json;charset=UTF-8');
header("Expires: Wed, 4 Apr 1984 13:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M_Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// get uploaded file
$file = JRequest::getVar('file', '', 'files', 'array');
// validate file data
$this->validateUploadedFile($file);
// get file name
$name = JRequest::getVar('name', $file['name']);
// decode name
$name = rawurldecode($name);
// check name
if (WFUtility::validateFileName($name) === false) {
throw new InvalidArgumentException('Upload Failed: The file name contains an invalid extension.');
}
// check file name
WFUtility::checkPath($name);
// get extension from file name
$ext = WFUtility::getExtension($file['name']);
// trim extension
$ext = trim($ext);
// check extension exists
if (empty($ext) || $ext === $file['name']) {
throw new InvalidArgumentException('Upload Failed: The file name does not contain a valid extension.');
}
// strip extension
$name = WFUtility::stripExtension($name);
// make file name 'web safe'
// $name = WFUtility::makeSafe($name, $this->get('websafe_mode', 'utf-8'), $this->get('websafe_spaces'), $this->get('websafe_textcase'));
//此处将makesafe改为直接用时间命名,纯数字,安全又可用
$name = date('Ymd-His-', time()).rand(0,999);
// check name
if (WFUtility::validateFileName($name) === false) {
throw new InvalidArgumentException('Upload Failed: The file name contains an invalid extension.');
}
// target directory
$dir = JRequest::getVar('upload-dir');
// deocode directory
$dir = rawurldecode($dir);
// check destination path
WFUtility::checkPath($dir);
$upload = $this->get('upload');
// Check file number limits
if (!empty($upload['total_files'])) {
if ($filesystem->countFiles($dir, true) > $upload['total_files']) {
throw new InvalidArgumentException(WFText::_('WF_MANAGER_FILE_LIMIT_ERROR'));
}
}
// Check total file size limit
if (!empty($upload['total_size'])) {
$size = $filesystem->getTotalSize($dir);
if (($size / 1024 / 1024) > $upload['total_size']) {
throw new InvalidArgumentException(WFText::_('WF_MANAGER_FILE_SIZE_LIMIT_ERROR'));
}
}
// add random string
if ($upload['add_random']) {
$name = $name . '_' . substr(md5(uniqid(rand(), 1)), 0, 5);
}
// rebuild file name - name + extension
$name = $name . '.' . $ext;
// create a filesystem result object
$result = new WFFileSystemResult();
$complete = false;
$contentType = JRequest::getVar('CONTENT_TYPE', '', 'SERVER');
// relative path
$relative = WFUtility::makePath($dir, $name);
// Only multipart uploading is supported for now
if ($contentType && strpos($contentType, "multipart") !== false) {
$result = $filesystem->upload('multipart', trim($file['tmp_name']), $dir, $name);
if (!$result->state) {
if (empty($result->message)) {
$result->message = WFText::_('WF_MANAGER_UPLOAD_ERROR');
}
$result->code = 103;
}
@unlink($file['tmp_name']);
$complete = true;
} else {
$result->state = false;
$result->code = 103;
$result->message = WFText::_('WF_MANAGER_UPLOAD_ERROR');
$complete = true;
}
// upload finished
if ($complete) {
if ($result instanceof WFFileSystemResult) {
if ($result->state === true) {
$this->setResult($this->fireEvent('onUpload', array($result->path, $relative)));
$this->setResult(basename($result->path), 'files');
} else {
$this->setResult($result->message, 'error');
}
}
die(json_encode($this->getResult()));
}
}