ОБНОВЛЕНО: я разрабатываю Air App для мобильных устройств, и у меня есть файл с именем «database.db» в applicationDirectory
это включено или добавлено через Flash CC IDE. Я предлагаю кому-то вознаграждение в размере 150, если он может помочь мне решить эту проблему, то есть помочь мне с сценарием загрузки на моем сервере, а также получить мой ActionScript для загрузки на него файла «database.db».
Что я надеюсь, что мой сценарий достигнет?
Я хочу время от времени выполнять резервное копирование этой базы данных, поэтому я надеюсь загрузить ее на сервер. Как бы я это сделал?
Код ниже не работает и выдает эту ошибку.
ОБНОВЛЕНИЕ: Вот ошибка, которую я получаю:
TypeError: Error #1034: Type Coercion failed: cannot convert "app:/database.db" to flash.net.FileReference.
Я не верю, что мой вопрос является точной копией, так как мне нужно загрузить файл, и приведенный пример не показывает, как данные преобразуются в тип данных для загрузки.
У меня есть сервер? Да, но на данный момент у меня нет сценария PHP, необходимого для выполнения этой загрузки, но в данный момент я пытаюсь просто получить файл из AS3, чтобы быть готовым к загрузке, и это то, что я не могу сделать ,
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequestMethod;
import flash.events.Event;
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.utils.*;
import flash.filesystem.File;
public class Main extends MovieClip {
private const UPLOAD_URL: String = "http://mywebsite.com/upload.php";
private var fr: FileReference;
public function Main()
{
var dir: File = File.applicationDirectory;
dir = dir.resolvePath("database.db");
trace(dir.url); // app:/database.db
var file: FileReference = FileReference(dir.url);
var request: URLRequest = new URLRequest();
request.url = UPLOAD_URL;
fr.upload(request);
}
}
}
Ваша ошибка исходит из этого кода:
var file:FileReference = FileReference(dir.url);
Во-первых, обратите внимание, что вы не используете new FileReference()
, вы просто используете FileReference()
который является форма литья. Потому что вы пытаетесь бросить строку dir.url
к FileReference
, вы получаете ошибку (приведение String
в FileReference
очевидно, что это невозможно, о чем говорит ошибка). Во-вторых, если вы хотели написать new FileReference(dir.url)
это все равно будет недействительным, потому что FileReference
не имеет аргументов конструктора. В-третьих, ваш fr
никогда ничего не назначается, так fr.upload()
потерпит неудачу, если выполнение когда-либо попадет туда.
Решение: File
наследуется от FileReference
и позволяет upload
быть вызванным без каких-либо ограничений. Так что просто позвоните upload
в вашей базе данных File
:
var file:File = File.applicationDirectory.resolvePath("database.db");
var request:URLRequest = new URLRequest();
request.url = UPLOAD_URL;
file.upload(request);
Обновить
Я предлагаю кому-то награду в 150, если они могут мне помочь через это
проблема, то есть помочь мне с сценарием загрузки на моем сервере, а также
получить мой Actionscript для загрузки в него файла database.db.
Поскольку вы используете PHP, хорошей отправной точкой является пример приведен в документации. Сваривая, вам просто нужно использовать move_uploaded_file()
против загруженных данных файла, найденных в $_FILES['Filedata']
(который будет состоять из $_FILES['Filedata']['tmp_name']
а также $_FILES['Filedata']['name']
для загруженного файла):
<?php
$tmp_file = $_FILES['Filedata']['tmp_name'];
$upload_file = $_FILES['Filedata']['name'];
$backup_file = basename($upload_file, '.db') . '_' . date('Y-m-d_H:i:s') . '.db';
$backup_dir = './db_backups/';
move_uploaded_file($tmp_file, $backup_dir . $backup_file);
?>
Замечания:
0777
) до PHP move_uploaded_file()
буду работать. Вы можете сделать это используя SSH, FTP или, в зависимости от того, как работает PHP, напрямую из сценария PHP, используя chmod($backup_dir, 0777)
,Обновление 2
Мой файл будет взят из applacationStorageDirectory. Как я
переместить файл из каталога приложения в каталог хранения для
цели тестирования?
Ты можешь использовать File/copyTo()
в скопировать файл:
var file:File = File.applicationDirectory.resolvePath("database.db");
var copyFile:File = File.applicationStorageDirectory.resolvePath("database_backup.db");
file.copyTo(copyFile, true);
Как подсказывают другие, ваш полный код должен выглядеть примерно так во флэш-памяти.
package
{
import flash.filesystem.File;
import flash.display.MovieClip;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLRequestMethod;
public class Main extends MovieClip
{
private const UPLOAD_URL: String = "http://mywebsite.com/upload.php";
public function Main()
{
var file:File = File.applicationDirectory.resolvePath("database.db");
var ur:URLRequest = new URLRequest();
//Extra parameters you want to send with the filedata
var uv:URLVariables = new URLVariables();
uv.filename = 'file_name_of_your_choice.db';
//attach data to request
ur.data = uv;
//request method
ur.method = URLRequestMethod.POST;
//request URL
request.url = UPLOAD_URL;
//Finally Upload it
file.upload(request);
}
}
}
Далее нужно установить на сервере php-скрипт для приема файловых данных. Вот простой скрипт, который вы можете использовать
<?php
//make sure you have this directory created on server and have enough permissions to write files
$dir = 'dbbackup';
$backup_file = $dir . '/' . $_POST['filename'];
//You should make your checks on the files here if its valid and allowed to be placed//allow to write files in directory
chmod($dir, 0777);
$status = ""if(move_uploaded_file($_FILES['Filedata']['tmp_name'], $backup_file))
{
$status = "success";
}
else
{
$status = "failed";
}
//reset permission back to read only
chmod($dir, 0644);
echo $status;
?>
Пожалуйста, убедитесь, что загруженный файл является действительным файлом, прежде чем перемещать его в нужное место. Простое размещение этого файла на сервере может быть угрозой безопасности, так как он может принять любой тип файла.
Надеюсь, это поможет.