Если не трогать всякие флешы и серверные компоненты, то можно сделать на основе функционала, предлагаемого HTML5. Проблема лишь в том, что вводится он медленно и поддерживается браузерами фигово:
1. Хром: начиная с 5-ой (?) версии добавили FormData (из XHR2). Теперь можно отсылать файлы (несмотря на то, что прочитать бинарное содержимое файла пока нельзя, во всяком случае в стабильных релизах) XHR'ом (а там, напомню, нужен multipart). В ранних версиях приходилось отправлять сырое бинарное содержимое файла, без каких-либо заголовков. Соответственно, веб-серверы не понимали, что им пришел файл, и вообще никак не обрабатывали присланную информацию (ее приходилось читать из входного потока). Есть поддержка XMLHttpRequestUpload, который позволяет мониторить прогресс загрузки.
2. Firefox: начиная с 3.5 (?) можно читать содержимое файлов, есть специальный метод для отправки двоичных данных. Так что отсутствие FormData ничем плохим не сказывается — multipart запрос можно сформировать самому. XMLHttpRequestUpload так же поддерживается.
3. Сафари: точка сказать не могу, но File, FormData, XMLHttpRequestUpload там реализованы (5.0 — 7533.16).
4. Опера, ИЕ: видимо, даже не слышали о таких. Для них придется делать по-старинке — флеш / серверсайд / etc.
Из разряда почитать:
javascript.ru/blog/Brmaley.ee/FileAPI — материал несколько устарел*
www.thecssninja.com/javascript/gmail-upload — материал несколько устарел*
code.google.com/p/html5uploader/ — библиотечка для D&D, но, на мой взгляд, она тоже несколько устарела* :)
* — имеется в виду поддержка такой штуки как FormData.