使用 PHP 列出图像文件——并区分大小写
图像文件的保管箱目录已按字母大小写收集变体,例如:
Bonsai.jpg, BONSAI.jpg, Bonsai.JPG, bonsai.jpg
我正在使用 CodeIgniter 制作一个 Web 应用程序来管理远程服务器上的这些文档。这意味着使用
- file_exists() 或 is_file() 来验证 文件的存在
- HTML img 标签以图形方式显示文件
但这两个工具都使用它们找到的第一个匹配项,无论大小写。我该如何处理这个问题?
(我注意到这个与此类似的问题 ,但适用于 Delphi 而不是 PHP。)
A drop-box directory for image files has collected variants by letter-case, for example:
Bonsai.jpg, BONSAI.jpg, Bonsai.JPG, bonsai.jpg
I am making a web app using CodeIgniter to manage these documents on a remote server. This means using
- file_exists() or is_file() to verify
a file's presence - HTML img tag to display the file graphically
But both these tools use the first match they find, regardless of case. How can I deal with this?
(I noticed this similar question as this, but for Delphi instead of PHP.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
它们绝对不应该使用 - 至少在区分大小写的文件系统上,例如 Linux 的默认文件系统(它仍然称为 ext2 吗?)。虽然在 IMO 中将这四个文件放在同一目录中是有问题的做法,但
file_exists()
和 Web 资源的服务都不应该显示您所描述的行为。Windows 上有所不同:FAT 和 NTFS 不区分大小写。在您的示例中,同一目录中只能存在您提到的四个文件之一。
They definitely shouldn't - at least not on a file system that is case sensitive, like Linux's default file system (is it still called ext2?). While it's questionable practice to have those four file in the same directory IMO, neither
file_exists()
nor the serving of web resources should show the behaviour you describe.It's different on Windows: FAT and NTFS are not case sensitive. In your example, only one of the four files you mention can exist in the same directory.
当接受图像时,我总是重命名它们,例如使用文件上传类的 CI 加密文件名选项来避免此类问题。否则它可能会变得非常令人头痛。
编辑:在下面的OP中添加我的评论
您可以轻松编写一个脚本,将所有文件名放入数组中,识别重复项并将_1附加到其名称中。现在您只有唯一的文件名。然后将其全部转换为小写。对于所有现有文件和新文件,您将文件名加密为 32 个字符的字符串。像这样的文件名批处理实际上非常简单。只需备份所有文件以防万一,很少会出错。
Codeigniter 有一些有用的函数,例如文件助手的
get_filenames()
,它将指定目录中的所有文件放入数组中,以及安全助手的dohash()
,它将加密文件文件名。对于将来的上传,请将encrypt_name
首选项设置为TRUE
When accepting images I always rename them, for example using CI's encrypt filenames option of the File Upload class to avoid these kind of problems. Otherwise it can turn in to a big headache.
EDIT: added my comment on the OP below
You can easily write a script that puts all filenames in to an array, identify duplicates and append _1 to their name. Now you have just unique filenames. Then you convert all to lowercase. For all existing files and new ones you encrypt the filenames to a 32 character string. Batch processing of filenames like this is actually quite easy. Just keep a back up of all files just in case, and very little can go wrong.
Codeigniter has some useful functions like the file helper's
get_filenames()
which puts all files in a specified directory in to an array, and the security helper'sdohash()
which would encrypt the filenames. For future uploads setencrypt_name
preference toTRUE