views:

58

answers:

2

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

  1. file_exists() or is_file() to verify a file's presence
  2. 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.)

+1  A: 

But both these tools use the first match they find, regardless of case

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.

Pekka
I think it is [ext4](http://en.wikipedia.org/wiki/Ext4) now
Gordon
'... it's questionable practice to have those four files ...' Yes, certainly! The idea is to clean it up, to start with.
Smandoli
Okay, I have more clarity now. My LAMP setup works as case-sensitive; my WAMP set up does not -- just as you say.
Smandoli
This means my working goals aren't compromised, since WAMP is the odd member of the setup. Maybe I will set up my test suite to adjust for environment, so I can enjoy the green bar everywhere.
Smandoli
@Smandoli ah, I see! This indeed makes a tricky test case. That may indeed call for the test to adjust for environment.
Pekka
@Smandoli maybe test for `PHP_WINDOWS_VERSION_MAJOR`? http://php.net/manual/en/reserved.constants.php
Pekka
Interesting! But I only need something to distinguish between my two devs and the production server. Something simple like SERVER_NAME, but haven't yet found one that is reliably on all three yet ...
Smandoli
+1  A: 

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's dohash() which would encrypt the filenames. For future uploads set encrypt_name preference to TRUE

stef
See 'The Back Story' comment on the OP. Your tip here may be extremely useful.
Smandoli
+1 This is a hugely helpful set of information. Pekka gets my "Accept" because his response was direct to my question. (Now if only one always knew what questions to ask ... ):-)
Smandoli