One thing I'll point out from a security standpoint is this:
on the protected page make a link to the file. Not directly, but via readfile.php?file=test.doc
For the most part, right. The problem is that you are then faced with the need to check the value of $_GET['file'] to make sure it's (a) a valid file and (b) isn't a file someone shouldn't be trying to look at. There are two approaches available:
1)
When you upload the file to the directory (yes, you're right about that part - it's surprising how many people I meet here don't get the difference between a file name and a URL), add an entry for it in a suitable database table. If you're already using one, all the better. You do this for the sake of being able to give the document a distinct ID number. Use that ID number in the links. That way, only files that are registered in that table can be accessed.
2)
Maybe simpler, but (possibly) more riskier; examine the name of the file asked for, make sure that it doesn't contain / or \ or any other such filesystem navigation stuff (otherwise someone could ask for any file on the system), and then check to see that the file asked for actually is in the document directory. One drawback to this approach though is potentially messy URLs as documents with all sorts of weird and wacky filenames are uploaded.
In either case, I should have mentioned that you probably also want to send the name of the document in the headers (see that manual page again), so that someone downloading it gets the right name to save it under.