编程语言
首页 > 编程语言> > php-如何存储具有非ASCII文件名的上传文件?

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

作者:互联网

我无法将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()会导致错误.

根据RFC 3986,对所有特殊字符进行百分比编码是合理的,我绝对应该对URI进行相同的操作.但是当我使用百分比编码的URI时,Apache会给出404错误,因为它会解码URL,并且可以找不到那个名字的东西.

例如:< img src =“ / upload /é.jpg” />给出Apache错误:

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

什么是正确的解决方案?如果我在Windows中重命名文件(é.jpg),则编码的HTML URI(é.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上的其他信息:

> Character Sets Used in File Names(请参阅:Code Pages)
> File and Directory Names(命名约定)

标签:file-upload,url,apache,windows,php
来源: https://codeday.me/bug/20191201/2081484.html