För FLASH:
För att spara data lokalt med flash kan du använda ett av tre sätt:Flash Player-cachen, en SharedObject , eller en FileReference objekt. Och för din lokala fil, glöm PHP och MySQL eftersom vi bara talar om data som du har (json, xml, txt, ...).
- Flash Player cache:
Du bör veta att som standard lägger flash player en lokal kopia av din fil i sin cache. Du kan använda den här lokala kopian som en offlinekälla för dina data, men glöm inte att flash player inte sparade den senaste versionen av din fjärrfil utan den första och att http://www.example.com/data.php skiljer sig från http://www.example.com/data.php?123 även om det är samma fil! För mer information om det, ta en titt på mitt svar på den här frågan .
- SharedObject :
Jag vet inte storleken på dina laddade data, men som Adobe sa om SharedObject:
Jag tror att det inte används för stora filer och det rekommenderas inte att lagra filer utan några enkla data. Naturligtvis, som en cookie för webbläsaren, behöver SharedOject användarens auktorisering för att skriva data till hårddisken, och användaren kan radera den när som helst.
- FileReference :
Jag tror att detta är det bästa sättet att göra det du letar efter. Du bör veta att för att spara en fil med FileReference, uppmanas din användare att välja en fil för att spara data och läsa den om en andra gång. Så om du inte vill ha någon användares interaktion med din applikation, glöm det här sättet.
FileReference med exempel:
var local_file_name:String = 'local.data',
file:FileReference = new FileReference(),
local_file_filter:FileFilter = new FileFilter('local data file', '*.data'),
remote_data_url:String = 'http://www.example.com/data.php',
url_request:URLRequest,
url_loader:URLLoader,
connected:Boolean = true;
if(connected){
get_remote_data();
} else {
get_local_data();
}
function get_remote_data(): void {
//we use a param to be sure that we have always the last version of our file
url_request = new URLRequest(remote_data_url + ('?' + new Date().getTime()));
url_loader = new URLLoader();
url_loader.addEventListener(Event.COMPLETE, on_data_loaded);
url_loader.load(url_request);
}
function get_local_data(): void {
// show the select dialog to the user to select the local data file
file.browse([local_file_filter]);
file.addEventListener(Event.SELECT, on_file_selected);
}
function on_data_loaded(e:Event): void {
var data:String = e.target.data;
// if the remote data is successfully loaded, save it on a local file
if(connected){
// show the save dialog and save data to a local file
file.save(data, local_file_name);
}
// use your loaded data
trace(data);
}
function on_file_selected(e:Event): void {
file.addEventListener(Event.COMPLETE, on_data_loaded);
file.load();
}
Denna kod kommer att visa varje gång en spardialogruta för användaren, naturligtvis, det är bara ett exempel, du måste anpassa den efter dina behov ...
REDIGERA
För AIR:
Med AIR behöver vi inte ett FileReference-objekt, istället använder vi Arkiv och en FileStream objekt för att spara data :
// for example, our local file will be saved in the same dir of our AIR app
var file:File = new File( File.applicationDirectory.resolvePath('local.data').nativePath ),
remote_data_url:String = 'http://www.example.com/data.php',
data_url:String = remote_data_url,
url_request:URLRequest,
url_loader:URLLoader,
connected:Boolean = true;
if(!connected){
// if we are not connected, we use the path of the local file
data_url = file.nativePath;
}
load_data();
function load_data(): void {
url_request = new URLRequest(data_url);
url_loader = new URLLoader();
url_loader.addEventListener(Event.COMPLETE, on_data_loaded);
url_loader.load(url_request);
}
function on_data_loaded(e:Event): void {
var data:String = e.target.data;
if(connected){
// save data to the local file
var file_stream:FileStream = new FileStream();
file_stream.open(file, FileMode.WRITE);
file_stream.writeUTFBytes(data);
file_stream.close();
}
trace(data);
}
Hoppas det kan hjälpa.