上传后文件名不正确 - PHP

时间:2013-03-09 20:59:19

标签: php windows file-upload encoding

我正在使用xampp在Win7 64上工作。 我正在上传一个文件,其中包含带有希腊字符的文件名。 文件名存储不正确 例如ελληνικά.xlsx存储为Ξμλληνικά.xlsx。

我想它必须对编码做些什么。

在我的html中我正在使用

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

我的javascript在下面给出

  function handleFileSelect(evt) { 
  var output=[];

  if (evt.target.files.length === 0 ) exit();
  var f = evt.target.files[0];
  if ($.inArray(f.name.split('.').pop(), ['xls', 'xlsx']) === -1 ) {
    $('#output').html('Wrong file type. Only Excel files are valid.');
    exit;
  }

  ans = fileunit(f.size);    
  output.push('<li><strong>', f.name, ' - ',
              ans[0].toFixed(2), ans[1], '</li>');
  $('#list').html('<ul>' + output.join('') + '</ul>');

  var fd = new FormData();
  fd.append('file', evt.target.files[0]); 

  $.ajax({
    url: 'uploaddata/file',
    data:fd,
    processData: false,
    contentType: false,
    type: 'POST',    
    success: function(data){
      $('#output').html(data);},
    error: function(data)  {
      $('#output').html(data);}    
  });
}    

服务器代码如下所示

    public function upload() {
// Checking upload error code
  if ($_FILES["file"]["error"] > 0)
    {
       echo file_upload_error_message($_FILES["file"]["error"]);
       return;
    }

  //Checking uplaod directory  
  $uploadDirectory = 'uploads' . DIRECTORY_SEPARATOR;
  if(!is_dir($uploadDirectory))
    {
      @mkdir ($uploadDirectory, 0766, true);
    }
  if(!is_dir($uploadDirectory))
    {
      echo 'Server error. Impossible to create the upload folder.';
      return;
    }
  elseif(!is_writable($uploadDirectory))
    {
      echo 'Server error. Upload directory is not writable.';
      return;
    }  

  //Checking if file is too big  
  if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&
         empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0) 
    {
       $error = 'Server error. File is too large, cannot upload.';
       echo $error;
       return;
    }

  $file_name = $_FILES["file"]["name"];
  if (!move_uploaded_file($_FILES["file"]["tmp_name"], $uploadDirectory.$file_name))
    {
      echo 'Server error. Error moving uploaded file from temp dir to upload dir';
      return;
    }
   echo $file_name . ' was uploaded successfully.';
    }

我在php文件中放置了一个断点,然后我检查了 $ _FILES [文件] [名]。
文件名似乎是正确的。文件内容上传也没有错误。

我想当文件从temp目录移动到上传目录时会发生一些事情 但我没有想法:(

3 个答案:

答案 0 :(得分:2)

我对西班牙语字符有同样的问题。在我的情况下,我使用utf8_decode()函数,它工作!

尝试

$file_name = utf8_decode($file_name);

答案 1 :(得分:0)

也许您需要urlencode()服务器端的名称,然后urldecode()进行显示。您的服务器只是没有正确处理Unicode。

答案 2 :(得分:0)

正如您所说的文件名正确显示(希腊字母),您只需要将它们转换为utf-8即可。您只需使用mb_convert_encoding

$file_name = mb_convert_encoding($_FILES[file][name], 'utf-8');