我正在使用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文件中放置了一个断点,我检查了
$带有_file[文件][名字]。
文件名似乎正确。此外,文件内容上传没有错误。
我猜当文件从临时目录移动到上传目录时发生了一些事情但是我没有主意了
我对西班牙字符也有同样的问题。在我的情况下,我使用了utf8_decode()函数,它工作了!
试
$file_name = utf8_decode($file_name);
也许您需要在服务器端urlencode()
名称,然后urldecode()
显示。您的服务器只是没有正确处理Unicode。
正如您所说的文件名正确显示(用希腊字母),您只需要将它们转换为utf-8
。您可以简单地使用mb_convert_encoding。
$file_name = mb_convert_encoding($_FILES[file][name], 'utf-8');