【问题标题】:special characters in file/folder names on Linux; Rename php function not workingLinux 上文件/文件夹名称中的特殊字符;重命名php函数不起作用
【发布时间】:2010-06-03 10:06:21
【问题描述】:

我正在使用函数 Rename() (php) 将一些图像从一个文件夹移动到另一个文件夹。

目标文件夹中包含特殊字符。

但是,在服务器上执行此操作时,我收到错误,即找不到具有名称的文件夹。在那个错误中,文件夹名称的特殊字符被替换为 Squares:

Warning: rename(../temp_images/668635375_1.jpg,../ad_images/B�tar/thumbs/668635375_1.jpg)
[function.rename]: No such file or directory in /var/www/etc....

它可以在我的本地机器上运行(windows xp)。

有什么想法吗? 疑难解答提示?

谢谢

【问题讨论】:

    标签: php linux security file


    【解决方案1】:

    我认为这在某些时候是一个编码问题。

    但是,无论如何,在文件名中使用非 ASCII 字符是一个滑坡。

    always recommend(因为another SO user 让我意识到了这个伟大而简单的想法)如果可以的话,urlencode() 文件名和urldecode() 在向公众提供它们时。这将为您提供一个文件名,该文件名由适用于我已知的每个文件系统的字符组成,并且可以包含任何 Unicode 字符。

    【讨论】:

    • 那么文件夹的名称是什么?我不太明白...你的意思是我应该对文件夹名称进行 urlencode 吗?
    • @Camran 是的,就是这样。请注意:可以在所有现代文件系统中存储 UTF-8 字符,因此您无需转换任何内容即可实现此目的,但是,您必须在任何地方都获得正确的编码。 urlencode() 建议是一种解决该麻烦的方法,并使其更容易跨平台移植。
    【解决方案2】:

    这很可能是一个编码问题:它甚至可能在源代码中(在其中编写了那些“特殊”字符的编码,在 php 源代码中?...),或其他地方,或两者兼而有之。我的意思是“其他地方”,它可能是字符串中的正确编码,被 php 解析错误,或者正确解析,但是从 rename() 和执行实际重命名的底层系统调用 (/filesystem) 错误地“传递” .. 根据我的经验,如果您对可以被不同系统读取或通过不同 API 访问的文件夹/文件使用“特殊”字符,则可能会发生不好的事情......所以:不要使用文件夹/文件中的“特殊”字符必须可由机器系统上的 http 服务器/php 脚本访问,这些字符可能与“创建”文件夹/文件的不同。

    阅读this 会有所帮助。

    【讨论】:

    • 此外,如前所述,如果您需要,您不能轻易将它们放在 url 中:您必须使用 %NN 表示法正确编码它们(urlencode 会这样做等等)..这将正确地保留来自 http 请求的编码,但它仍然无法确保它与您在源或其他任何地方硬编码的编码匹配,和/或文件夹名称的编码;顺便说一句,您可以通过 mysite.com/odddir%80%90%6F 或任何您需要的 %.. 等客户端访问它吗?
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    相关资源
    最近更新 更多