Andy E ha ragione sul fatto che non esiste un modo basato su HTML per farlo *; ma se vuoi usare Flash, puoi farlo. Quanto segue funziona in modo affidabile sui sistemi in cui è installato Flash. Se la tua app deve funzionare su iPhone, ovviamente avrai bisogno di una soluzione basata su HTML di riserva.
* ( Aggiornamento 22/04/2013: HTML ora lo supporta, in HTML5. Vedi le altre risposte.)
Il caricamento di Flash ha anche altri vantaggi: Flash ti dà la possibilità di mostrare una barra di avanzamento mentre il caricamento di un file di grandi dimensioni procede. (Sono abbastanza sicuro che sia così che fa Gmail, utilizzando Flash dietro le quinte, anche se potrei sbagliarmi su questo.)
Ecco un'app Flex 4 di esempio che consente all'utente di scegliere un file e quindi di visualizzarlo:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="init()">
<fx:Declarations>
</fx:Declarations>
<s:Button x="10" y="10" label="Choose file..." click="showFilePicker()" />
<mx:Image id="myImage" x="9" y="44"/>
<fx:Script>
<![CDATA[
private var fr:FileReference = new FileReference();
// Called when the app starts.
private function init():void
{
// Set up event handlers.
fr.addEventListener(Event.SELECT, onSelect);
fr.addEventListener(Event.COMPLETE, onComplete);
}
// Called when the user clicks "Choose file..."
private function showFilePicker():void
{
fr.browse();
}
// Called when fr.browse() dispatches Event.SELECT to indicate
// that the user has picked a file.
private function onSelect(e:Event):void
{
fr.load(); // start reading the file
}
// Called when fr.load() dispatches Event.COMPLETE to indicate
// that the file has finished loading.
private function onComplete(e:Event):void
{
myImage.data = fr.data; // load the file's data into the Image
}
]]>
</fx:Script>
</s:Application>