更新:我正在开发一款适用于移动设备的Air App,我在applicationDirectory
中有一个名为“database.db”的文件,该文件包含在Flash CC IDE中或通过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 :(得分:1)
您的错误来自此代码:
var file:FileReference = FileReference(dir.url);
首先,请注意您不使用new FileReference()
,只需使用FileReference()
即form of casting。因为您尝试将字符串dir.url
强制转换为FileReference
,所以会出现错误(从String
到FileReference
的强制转换显然是不可能的,这就是错误说的)。其次,如果您打算写new FileReference(dir.url)
,那么它仍然无效,因为FileReference
has no constructor arguments。第三,你的fr
从未被分配任何内容,因此如果执行到那里fr.upload()
将会失败。
解决方案:File
inherits from 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,因此example given in the documentation是一个很好的起点。将其简化,只需对move_uploaded_file()
上传的文件数据$_FILES['Filedata']
使用$_FILES['Filedata']['tmp_name']
and $_FILES['Filedata']['name']
(对于上传的文件,其中包含SSH):
<?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()
)。您可以使用FTP,file type或使用chmod($backup_dir, 0777)
直接从PHP脚本执行,具体取决于PHP的运行方式。File/copyTo()
进行一些验证。更新2
我的文件将从applacationStorageDirectory中获取。我如何能 将文件从app目录移动到存储目录 测试目的?
您可以copy a file使用https://discourse.mozilla-community.org/t/firefox-addon-event-on-a-specific-command-line/6028/10?u=noitidart:
var file:File = File.applicationDirectory.resolvePath("database.db");
var copyFile:File = File.applicationStorageDirectory.resolvePath("database_backup.db");
file.copyTo(copyFile, true);
答案 1 :(得分:1)
正如其他人所建议的那样,您的完整代码必须在flash中看起来像这样。
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脚本来接受filedata,这是一个你可以使用的简单脚本
<?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;
?>
在将上传的文件移至所需位置之前,请务必检查上传的文件是否为有效文件。简单地将此文件放在服务器上可能是安全威胁,因为它可以接受任何类型的文件。
我希望这会有所帮助。