File upload 让用户上传和存储文件名中带有国家字符的文件有多糟糕?

File upload 让用户上传和存储文件名中带有国家字符的文件有多糟糕?,file-upload,internationalization,filenames,File Upload,Internationalization,Filenames,我们的CMS接受名称中带有国家字符的文件,并将其毫无问题地存储在服务器上。但从长远来看,这种方法有多糟糕?例如,是否可以存储文件名为希伯来语、阿拉伯语或任何其他语言的非拉丁字母的文件?是否有标准的既定方法来处理这些问题 只要从请求的头中检测到它所在的字符集,并在内部使用一致的字符集(如UTF-8),就可以了。这是一个好主意。作为一名匈牙利人,当我被禁止使用诸如58378 乌德帕特: 示例:我无法使用Android SDK(不创建新用户),因为我的用户名中有一

我们的CMS接受名称中带有国家字符的文件,并将其毫无问题地存储在服务器上。但从长远来看,这种方法有多糟糕?例如,是否可以存储文件名为希伯来语、阿拉伯语或任何其他语言的非拉丁字母的文件?是否有标准的既定方法来处理这些问题

只要从请求的头中检测到它所在的字符集,并在内部使用一致的字符集(如UTF-8),就可以了。

这是一个好主意。作为一名匈牙利人,当我被禁止使用诸如58378

乌德帕特: 示例:我无法使用Android SDK(不创建新用户),因为我的用户名中有一个é。我也遇到了类似的问题,英特尔的C++编译器。 软件通常不会使用这样的文件名进行正确测试。Windows API仍然提供“ANSI”编码的函数版本,许多开发人员似乎不了解其潜在的问题。我还不断地看到那些把我的名字弄得一团糟的网页


我不是说不允许这样的文件名,事实上,在21世纪,我希望能够在任何地方使用这样的字符。但是要做好准备,以免遇到问题。

在Unix服务器上,在文件名中接受任何Unicode字符,然后在保存之前将文件名转换为UTF-8,在技术上是可行的,而且很容易。但是,转换过程中可能会出现错误(在您使用的HTML模板引擎或web框架中,或在用户的web浏览器中),因此可能会有一些用户抱怨他们上载的某些文件消失了。根本原因可能是错误的文件名转换。如果文件名中的所有字符或非拉丁语字符,而您(作为软件开发人员)不会说这种外语,那么请好运地找出文件发生了什么。

一种标准方法是自己生成唯一的名称,并将原始文件名存储到其他地方。通常,即使您的底层操作系统和文件系统允许在文件名中使用任意Unicode字符,您也不希望用户决定服务器上的文件名。这样做可能会带来某些风险并导致问题,例如名称过长或文件系统冲突。Facebook、flickr和许多其他网站就是这样做的例子


对于生成唯一的文件名,Guid值将是一个不错的选择。

将原始文件名存储在某种数据库中,以防您需要使用它

然后,使用唯一的字母数字id重命名文件名,保留原始文件扩展名

如果需要许多文件,则应创建目录以对文件进行分组。对大多数人来说,使用年、月、日、小时和分钟就足够了。例如:

.../2010/12/02/10/28/1a2b3c4d5e.mp3

是的,我有过大量mp3收藏的经验,这些收藏以歌曲发源国的语言命名而臭名昭著,这可能会在多个地方造成麻烦。

请详细说明。所有经过认证的Windows软件都专门为此进行了测试。@MSalters:并非所有软件都经过Windows认证。我添加了一些示例。“Windows API使用ANSI编码”?是的,在Windows 95天的时候。但是NT一直都是基于Unicode(UTF-16)的——参见A/W变体。在W95上,W varaint被映射到A,但在NT上它被反转。COM API一直都是Unicode only(BSTR)@MSalters:你是对的,但它仍然提供了函数的“ANSI”编码版本,开发人员倾向于使用它们。我更正了我的帖子。刚刚发现可能是问题主题:。基本上说,没有现成的(即跨浏览器)方法强制下载具有非US-ASCII文件名的文件。您是否可以分享在这些文件中遇到问题的示例?首先想到的是需要文件名作为参数和shell脚本的系统调用。此外,随着软件升级,例如文件名现在可能开始以某种方式工作,并以新的方式出现。但并非完全有用:)