Pour FLASH :
Pour sauvegarder les données localement avec flash, vous pouvez utiliser l'une des 3 manières suivantes :le cache Flash Player, un SharedObject , ou un FileReference objet. Et pour votre fichier local, oubliez PHP et MySQL car nous ne parlons que des données que vous avez récupérées ( json, xml, txt, ... ).
- Cache Flash Player :
Il faut savoir que par défaut, flash player met une copie locale de votre fichier dans son cache. Vous pouvez utiliser cette copie locale comme source hors ligne de vos données, mais ici n'oubliez pas que flash player n'a pas enregistré la dernière version de votre fichier distant mais la première et que http://www.example.com/data.php est différent de http://www.example.com/data.php?123 même si c'est le même fichier ! Pour plus de détails à ce sujet, consultez ma réponse à cette question .
- ObjetPartagé :
Je ne connais pas la taille de vos données chargées, mais comme Adobe l'a dit à propos de SharedObject :
Je pense que cela n'est pas utilisé pour les fichiers volumineux et qu'il n'est pas recommandé de stocker des fichiers mais des données simples. Bien sûr, en tant que cookie pour le navigateur, SharedOject a besoin de l'autorisation de l'utilisateur pour écrire des données sur le disque dur, et l'utilisateur peut les supprimer à tout moment.
- Référence du fichier :
Je pense que c'est la meilleure façon de faire ce que vous recherchez. Il faut savoir que pour enregistrer un fichier à l'aide de FileReference, votre utilisateur est invité à sélectionner un fichier pour enregistrer les données et le lire dans un second temps. Donc, si vous ne voulez pas qu'un utilisateur interagisse avec votre application, oubliez cette manière.
FileReference utilisant l'exemple :
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();
}
Ce code montrera à chaque fois une boîte de dialogue de sauvegarde à l'utilisateur, bien sûr, ce n'est qu'un exemple, vous devez l'adapter à vos besoins...
MODIFIER
Pour AIR :
Avec AIR, nous n'avons pas besoin d'un objet FileReference, nous utilisons à la place Fichier et un FileStream objet pour sauvegarder les données :
// 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);
}
J'espère que cela peut aider.