gpt4 book ai didi

php - 如何存储非 ASCII 文件名的上传文件?

转载 作者:可可西里 更新时间:2023-11-01 09:25:49 26 4
gpt4 key购买 nike

我无法将 UTF-8 文件名传递给 move_uploaded_file() 因为它按字节转换,导致文件系统中的名称错误。例如:

move_uploaded_file($_FILES['userfile']['tmp_name'], '\upload\é.jpg');

在上传目录中创建xa9.jpg

虽然 Windows API 支持 UTF-16,但将此类文件名(例如 iconv('UTF-8', 'UTF-16', 'é') )传递给 move_uploaded_file()导致错误。

percent-encode 所有特殊字符是合理的,根据 RFC 3986,我绝对应该对 URI 做同样的事情。 .但是,当我使用百分比编码的 URI 时,Apache 给出了 404 错误,因为它解码了 URL 并且找不到该名称的任何内容。

例如:<img src="/upload/%C3%A9.jpg" />给出 Apache 错误:

File does not exist: […]/upload/\xc3\xa9.jpg.

什么是正确的解决方案?如果我在 Windows 中重命名文件 (é.jpg),编码的 HTML URI (%C3%A9.jpg) 将按预期工作。


有关该主题的一些信息:http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php

最佳答案

iconv('UTF-8', 'Windows-1250', $_FILES['userfile']['name']) 传递给 move_uploaded_file()相对于使用 UTF-16,将 HTML 的文件名保存为 rawurlencode($_FILES['userfile']['name']) 可行。

如果此文件名存储在数据库中,则任何文件请求都应引用 iconv('UTF-8', 'Windows-1250', rawurldecode($filename))

我使用 Windows-1250 字符集,因为这是我系统上的默认字符集。

MSDN 上的其他信息:

关于php - 如何存储非 ASCII 文件名的上传文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9984011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com