文件重命名(特殊字符)和XHR上传有问题

问题描述 投票:0回答:1

为简单起见,我使用XHR将文件上传到网站。在将名称保存在数据库中并将其存储在我的文件夹中之前,这些文件将被重命名并“清理”(特殊字符等)。

当我上传任何类型的文件,其中包含任何类型的奇怪字符时,从Mac开始它非常顺利,没有人受伤。当我在Windows上运行的PC上使用完全相同的文件尝试相同的操作时,我的文件不会重命名。最糟糕的是,特殊的字符被问号取代,然后就不可能从我的FTP中删除它们了。

我只是试图对我的正则表达式进行一些更改,但我很困惑,因为它适用于Mac,但不适用于Windows。所以我想这可能与操作系统在上传之前如何传输文件编码或类似事件有关。

这是我的JS:

$("#assist-form").submit(function() {
    var str      = $(this).serialize(),
        progress = document.getElementById("progress"),
        bar      = document.getElementById("progress-bar"),
        percent  = document.getElementById("percent");

    $.ajax({
        xhr: function() {
            var xhr = new window.XMLHttpRequest();
            progress.style.display="block";

            xhr.upload.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total;
                    percentComplete = parseInt(percentComplete * 100);

                    var percentVal = percentComplete + "%";
                    bar.style.width=percentVal;
                    //console.log(percentVal);
                    percent.innerHTML = percentVal;
                }
            }, false);

            return xhr;
        },              
        type: "POST",
        url: "'.CONTROLLERS.'assistManage.php",
        data: new FormData( this ),
        processData: false,
        contentType: false,
        dataType: "json",
        success: function(msg) {
            if (msg.result == 0 || msg.result == 1 || msg.result == 2) {
                window.location.href="'.ASSISTS.'&resu="+msg.result+"";
            } else {
                $.bootstrapGrowl(msg.result, {
                    type: "danger",
                    width: "350"
                });
            }
        }
    });
    return false;
});

我处理文件的PHP部分:

if ( isset($_FILES['files']) && $_FILES["files"]["error"][0] == 0 )
{
    $allowed = array('png', 'jpg', 'gif', 'xls', 'xlsx', 'doc', 'docx', 'pdf', 'eml', 'msg', 'rtf');
    $docs = $_FILES['files'];

    foreach ( $docs['tmp_name'] as $key => $tmp_name )
    {
        $file_ext   = pathinfo($docs['name'][$key], PATHINFO_EXTENSION);
        $file_name  = Engine::cleanStr($docs['name'][$key], true);
        $file_size  = $docs['size'][$key];
        $file_name_final = 'assist_'.$id.'-'.$file_name;

        if ( !in_array(strtolower($file_ext), $allowed) )
            $error .= $file_name.' : format de fichier non autorisé<br />';
        elseif ( $file_size > 5000000 ) // 5 Mb
            $error .= $file_name.' : fichier trop lourd<br />';
        else
        {
            if ( move_uploaded_file($tmp_name, '../'.UPLOADS.$file_name_final) )
                $req .= "INSERT INTO ".PREFIX."files VALUES ('0', '$id', '$file_name_final');";
            else
                $error .= $file_name.' : Erreur à l\'upload du fichier';
        }
    }

}

我的功能是“清理”文件名:

static function cleanStr ( $txt, $punctuation = false )
{
    $txt = trim($txt);
    $txt = str_replace('œ', 'oe', $txt);
    $txt = str_replace('Œ', 'Oe', $txt);
    $txt = str_replace('æ', 'ae', $txt);
    $txt = str_replace('Æ', 'Ae', $txt);
    $txt = str_replace('²', '2', $txt);
    $txt = str_replace('³', '3', $txt);
    $txt = str_replace('°', '', $txt);  
    $txt = iconv("UTF-8", "ISO-8859-1//IGNORE", $txt);  
    if ( $punctuation ) 
    {
        $punct_array = array(',', ':', ';', '?', '!', '(', ')', '[', ']', '#', '&');
        $punct_array2 = array(' ', "'", '---', '--');

        $txt = str_replace($punct_array, '' , $txt);
        $txt = str_replace($punct_array2, '-' , $txt);
    }

    return strtolower($txt);
}

总而言之,像这样的“Reçu-de-billet-électronique.txt”这样的文件名在从Mac上传时会变成“recu-de-billet-electronique.txt”并且“re?u-de-billet-?lectronique.txt” “从Windows上传时。

完全相同的文件,在完全相同的网站上,具有完全相同的脚本,但结果完全不同。我不知道在哪里看。

php ajax xmlhttprequest
1个回答
0
投票

尝试更换

$txt = iconv("UTF-8", "ISO-8859-1//IGNORE", $txt); 

用这个

setlocale(LC_CTYPE, 'cs_CZ');
$txt = iconv('UTF-8', 'ASCII//IGNORE', $txt);

来源 - https://www.php.net/manual/en/function.iconv.php

© www.soinside.com 2019 - 2024. All rights reserved.