Here's the actual dirt on how ASP.NET handles files. It's version dependant, but 2.0 and all subsequent versions do write uploads to disk before you get a chance to handle them. The above answers are actually wrong -- ASP.NET above 2.0 will write the file to disk. If you think about it, loading an upload into memory opens you to a DDOS hole as large files would take up increasing amounts of server memory. By version, here's how ASP.NET acts:
ASP.NET 1.0 and 1.1 loaded the whole request in memory before you could access it. This meant that large files could potentially fill all memory, causing exceptions and otherwise bringing down the server.
ASP.NET 2.0 introduced a disk caching scheme for uploads, again snagging the upload and processing it before client code can handle it. The temporary folder can be accessed as follows:
string uploadFolder = Path.Combine(HttpRuntime.CodegenDirInternal, "uploads");
At least now it's cached to disk so you don't have the memory issues from 1.0 and 1.1, but you still can't access it until it's been fully retrieved.
begin plug
I've gotten a lot of experience in this area by developing my SlickUpload ASP.NET upload component. It bypasses all of the above issues for ASP.NET 1.1 and above by intercepting the upload before ASP.NET gets a chance to handle it and allowing you to direct it to a file, a database (e.g. SQL Server), or your own custom stream. It also provides an AJAX progress bar, templating and styling of the selection area, validation, and many other features.