如何解决Drupal5后中文文件名上传问题?

由 kooyii 于 周四, 2008-04-24 11:11 提交。

我曾在Drupal4.6开发过应用,当时将内码改为gb2312,安全支持中文名上传。但使用Drupal5以上时如何解决这个问题?

重命名

上传照片后重命名图片文件,程序上要稍微修改下

我自己的方法

我搜了一下本网站,涉及PHP5或PHP4问题,还有MYSQL使用的字符集等。我自己按网上的一些方法做了以下尝试:
1,安装transliteration模组,实现保证中文名文件经过转化保存到服务器。
2,以filemanager和attachment代替upload。
3,修改表file增加realname字段,varchar(255)
4,修改filemanager函数filemanager_add_upload为如下

 function filemanager_add_upload($source, $area, $private = FALSE, $file = FALSE) {
  $upload = file_check_upload($source);
return filemanager_add_file($area, $upload->filepath, $upload->filename, $upload->filemime, FALSE, $private, $file,$upload->realname);
}

5,修改filemanager_add_file函数
function filemanager_add_file($area, $path, $filename, $mimetype = 'application/unknown', $remove = TRUE, $private = FALSE, $file = FALSE,$realname ='') {

即在函数filemanager_add_file参数中增加$realname=''
在这个函数找到内容如下并修改:
    // This is a net new file find a directory for it and setup the object
    $file->fid = db_next_id('{file}_fid');
    $file->area = $area;
    $file->filename = $filename;
  //增加以下内容
  <em>$file->realname = $realname ? $realname : $filename;</em>

再在这个函数中向下找到如下句子:
if ($update) {
      db_query("UPDATE {file} SET working='%s' WHERE fid=%d", $file->working, $file->fid);
    }
    else {
      db_query("INSERT INTO {file} (fid, area, directory, filename, mimetype, size, active, working, private) VALUES (%d,'%s',%d,'%s','%s',%d,'%s','%s','%s')",
$file->fid, $file->area, $file->directory, $file->filename, $file->mimetype, $file->size, $file->active, $file->working, $file->private);
    }

将db_query内容修改为如下:
      db_query("INSERT INTO {file} (fid, area, directory, filename, mimetype, size, active, working, private,realname) VALUES (%d,'%s',%d,'%s','%s',%d,'%s','%s','%s','%s')",
$file->fid, $file->area, $file->directory, $file->filename, $file->mimetype, $file->size, $file->active, $file->working, $file->private,$file->realname);

6,attachment只要修改一个函数attachment_add

if (isset($remove_key)) {
    array_splice($node->attachments, $key, 1);
  }
  else {
$new_attachment['title'] = $file->filename;

改为
if (isset($remove_key)) {
    array_splice($node->attachments, $key, 1);
  }
  else {
$new_attachment['title'] = $file->realname ? $file->realname : $file->filename;

这样就可以应付所有的文件名问题了!