AS3 загрузить файл на сервер без использования FileReference.browse ()

ОБНОВЛЕНО: я разрабатываю 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);
}
}
}

0

Решение

Ваша ошибка исходит из этого кода:

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);
1

Другие решения

Как подсказывают другие, ваш полный код должен выглядеть примерно так во флэш-памяти.

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;
?>

Пожалуйста, убедитесь, что загруженный файл является действительным файлом, прежде чем перемещать его в нужное место. Простое размещение этого файла на сервере может быть угрозой безопасности, так как он может принять любой тип файла.

Надеюсь, это поможет.

1