views:

50

answers:

1

Hi

I need a place to store images. My first thought was to use the database, but many seems to recommend using the filesystem. This seems to fit my case, but how do I implement it?

The filenames need to be unique, how to do that. Should I use a guid?

How to retrieve the files, should I go directly to the database using the filename, make a aspx page and passing either filename or primary key as a querystring and then read the file.

What about client side caching, is that enabled when using a page like image.aspx?id=123 ?

How do I delete the files, when the associated record is deleted?

I guess there are many other things that I still haven't thought about.

Links, samples and guidelines are very welcome!

+1  A: 

Uploading Files in ASP.NET 2.0

You seem up in the air about how to do this, so I'll give you a few ideas to get you going.

If you want to use a file system make sure you know the limit of how many files are permitted per directory, so you can set up a system that creates subdirectories. http://ask-leo.com/is_there_a_limit_to_what_a_single_folder_or_directory_can_hold.html

I would make a table something like this :

FileUpload
UploadID          int identity/auto generate PK, used as FK in other tables
InternalFileName  string
DisplayFileName   string
Comment           string
MimeType          string
FileSizeBytes     int
FileHash          string MD5 Hash of a File
UploadUserID      int  FK to UserID
UploadDate        date

You would include the UploadID in the table that "owns" this upload, like the Order associated with it, etc. You could add the InternalDirectory column, but I prefer to calculate this based on a constant Root value + some key specific value. For example, the complete file name and directory would be:

Constant_Root+'\'+OrderID+'\'+InternalFileName

You could make the InternalFileName be the UploadID and the file extension from the original file. That way it would be unique, but You'll have to insert the row as the first part of the process, and update it after after you know the file name and identity/auto generate row value. You could make the InternalFileName something like YYYMMDDhhmissmmm and the file extension from the original file, which may be unique enough based on how you use subdirectories.

I like to store a MD5 Hash of a File which makes detecting duplicates easy.

MimeType and FileSizeBytes can be found from the file system, but if you store them in the database, it makes some maintenance easier since you can query for large files or files of certain types.

KM