代码之家  ›  专栏  ›  技术社区  ›  Hrvoje Batrnek

CKEditor文件上载错误的文件编码(非UTF-8)

  •  0
  • Hrvoje Batrnek  · 技术社区  · 6 年前

    我在Windows IIS上使用PHP 5.6。当通过ckeditor创建链接并上载该链接的文件时,服务器上的文件名不包含特殊字符,如:。问题仅在通过ckeditor上载文件时出现。将文本上载到数据库时,编码并没有问题。我如何让ckeditor告诉服务器正确的编码,或者包括我请求的编码,或者我需要做的任何事情来让它工作?这种PHP编码是一场噩梦!

    我用以下方法修复了它:

    iconv("utf-8", "cp1250", $_FILES['upload']['name'])
    

    但是,我是否无法告诉PHP将所有内容都当作UTF-8来处理?我尝试过在php中设置关于编码和代码页的每一个设置。ini转换为UTF-8,但没有帮助。这看起来确实前后矛盾,而且很挑剔。有没有PHP专家能告诉我解决这个问题的简单方法?

    以下是上载标题:

    POST https://nsdmup-a.hr/cms/news_fileupload.php?CKEditor=fullText&CKEditorFuncNum=1&langCode=en HTTP/1.1
    Host: nsdmup-a.hr
    Connection: keep-alive
    Content-Length: 1069214
    Cache-Control: max-age=0
    Origin: https://nsdmup-a.hr
    Upgrade-Insecure-Requests: 1
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysc0FA4jsjDe2Z4s8
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Referer: https://nsdmup-a.hr/cms/news_add.php?editId=293
    Accept-Encoding: gzip, deflate, br
    Accept-Language: hr-HR,hr;q=0.9,en-US;q=0.8,en;q=0.7,sr;q=0.6,bs;q=0.5,ja;q=0.4
    Cookie: PHPSESSID=45iuc1r017sb75bte57dl0te71
    
    ------WebKitFormBoundarysc0FA4jsjDe2Z4s8
    Content-Disposition: form-data; name="upload"; filename="511-D-022-2018. dopis ministru - zapšljavanje namještenika2.pdf"
    Content-Type: application/pdf
    

    这是他写入磁盘的文件名: “511-D-022-2018。dopis ministru-zapljavanje namjetenika2.pdf”

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wizard    6 年前

    根据我的经验,这是Windows和v7.0之前的所有PHP版本的问题

    所以,要么你继续使用 iconv 函数或将PHP升级到至少v7.1( changelog regarding Windows )

    还可以创建包含以下内容的帮助器函数:

    if (version_compare(phpversion(), '7.1.0', '<') and strtoupper(substr(php_uname('s'), 0, 3)) === 'WIN')
    {
        // Windows and PHP 7.0 or less. Use iconv
        return iconv('utf-8', 'cp1250', $filename);
    }
    else
    {
        // Should be all good
        return $filename;
    }