AS3在不使用FileReference.browse()的情况下将文件上传到服务器

时间:2016-02-03 00:11:42

标签: php actionscript-3 air

更新:我正在开发一款适用于移动设备的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);
        }
    }    
}

2 个答案:

答案 0 :(得分:1)

您的错误来自此代码:

var file:FileReference = FileReference(dir.url);

首先,请注意您不使用new FileReference(),只需使用FileReference()form of casting。因为您尝试将字符串dir.url强制转换为FileReference,所以会出现错误(从StringFileReference的强制转换显然是不可能的,这就是错误说的)。其次,如果您打算写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())。您可以使用FTPfile 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;
?>

在将上传的文件移至所需位置之前,请务必检查上传的文件是否为有效文件。简单地将此文件放在服务器上可能是安全威胁,因为它可以接受任何类型的文件。

我希望这会有所帮助。