我有一个站点,其中各个页面可能需要一些 javascript 或 CSS 文件连接到它们的头部。在管理此过程时,我试图将所有内容都保留在客户端,而不是使用 FTP 并在代码中整理所有内容,因此我需要能够上传 css 和 js 文件。
我已经启动并运行了 CCK filefield,它可以处理 css 文件,但它拒绝上传 .js 文件。相反,它似乎将每个 .js 视为“.js.txt”,然后文件在服务器上显示为 thisismyfile.js.txt
不理想...
有谁知道如何解决这个问题。是 Drupal 或服务器的 mime 类型问题,还是 Drupal 设置为避免脚本上传和 n00b 黑客攻击。
文件上传后,我打算在页面或节点上使用 PHP 模式调用 drupal_add_css和 drupal_add_js .
最佳答案
查看 filefield 模块 field_file.inc
中的 field_file_save_file()
函数,您可以找到以下代码片段
// Rename potentially executable files, to help prevent exploits.
if (preg_match('/\.(php|pl|py|cgi|asp|js)$/i', $file->filename) && (substr($file->filename, -4) != '.txt')) {
$file->filemime = 'text/plain';
$file->filepath .= '.txt';
$file->filename .= '.txt';
}
所以是的,正如 Jeremy 猜测的那样,这是一个“安全问题”。
您可以修补该 RegEx 以立即“修复”,但这将完全删除该站点上使用的所有文件字段的有用安全检查。
因此,更具体的解决方法可能是更好的方法。由于无论如何你都想通过代码中的 drupal_add_js()
调用添加文件,你不妨在那里进行重命名,添加某种验证以确保你可以“信任”该文件(例如谁上传它,无论如何)。
编辑:关于调用 drupal_add_js()
时重命名(和替代)的选项:
- 要重命名文件,请查看
file_move()
功能。这样做的一个问题是它不会更新文件表中的相应条目,因此如果移动操作成功,您也必须这样做。 (文件字段只存储文件表中相应条目的'fid',因此您需要通过'fid'在那里找到它并根据您的重命名更改'filename','filepath'和'filemime'条目/移动) - 或者,您可以只加载 *.js.txt 文件的内容,并使用
drupal_add_js()
的“内联”选项添加该字符串。 .这会不那么“优雅”,并且可能会影响性能,但如果这些在您的特定情况下不是重要标准,那么问题就不那么大了。 - 另一种选择是只将 *.js.txt 文件原样传递给
drupal_add_js()
,忽略“错误的”扩展名。一个简短的本地测试表明这是有效的(至少在 firefox 中)。这可能是“最省力”的解决方案,但需要对与“错误命名”js 文件的使用有关的不同浏览器行为进行一些额外测试。
关于javascript - Drupal Filefield 不会上传 javascript 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1378246/