要将文件上载到服务器,需要首先调用
browse()
方法,以允许用户选择一个或多个文件。接下来,当调用
FileReference.upload()
方法时,将所选文件传输到服务器。如果用户使用
FileReferenceList.browse()
方法选择了多个文件,则 Flash Player 会创建所选文件的数组,称为
FileReferenceList.fileList
。随后便可使用
FileReference.upload()
方法分别上载每个文件。
注:
使用
FileReference.browse()
方法时,您只能上载单个文件。要允许用户上载多个文件,请使用
FileReferenceList.browse()
方法。
默认情况下,系统文件选取器对话框允许用户从本地计算机选取任何文件类型。开发人员可以通过使用 FileFilter 类并将文件过滤器实例数组传递给
browse()
方法来指定一个或多个自定义文件类型过滤器:
var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf");
var allTypes:Array = new Array(imageTypes, textTypes);
var fileRef:FileReference = new FileReference();
fileRef.browse(allTypes);
用户在系统文件选取器中选择文件并单击“打开”按钮后,会调度
Event.SELECT
事件。如果使用
FileReference.browse()
方法选择要上载的文件,下列代码会将文件发送到 Web 服务器:
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
try
{
var success:Boolean = fileRef.browse();
}
catch (error:Error)
{
trace("Unable to browse for files.");
}
function selectHandler(event:Event):void
{
var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm")
try
{
fileRef.upload(request);
}
catch (error:Error)
{
trace("Unable to upload file.");
}
}
function completeHandler(event:Event):void
{
trace("uploaded");
}
通过使用
URLRequest.method
和
URLRequest.data
属性以
POST
或
GET
方法发送变量,可以用
FileReference.upload()
方法将数据发送到服务器。
尝试使用
FileReference.upload()
方法上载文件时,将调度以下事件:
-
open
事件 (
Event.OPEN
):在上载操作开始时调度。
-
progress
事件 (
ProgressEvent.PROGRESS
):以字节为单位上载文件中的数据时定期调度。
-
complete
事件 (
Event.COMPLETE
):上载操作成功完成时调度。
-
httpStatus
事件 (
HTTPStatusEvent.HTTP_STATUS
):上载过程因 HTTP 错误而失败时调度。
-
httpResponseStatus
事件 (
HTTPStatusEvent.HTTP_RESPONSE_STATUS
):如果调用
upload()
或
uploadUnencoded()
方法时尝试通过 HTTP 访问数据,并且 Adobe AIR 可以检测并返回请求的状态代码,则调度此事件。
-
securityError
事件 (
SecurityErrorEvent.SECURITY_ERROR
):上载操作因违反安全规则而失败时调度。
-
uploadCompleteData
事件 (
DataEvent.UPLOAD_COMPLETE_DATA
):成功上载并从服务器接收数据之后调度。
-
ioError
事件 (
IOErrorEvent.IO_ERROR
):由于下列任何原因导致上载过程失败时调度:
-
当 Flash Player 正在读取、写入或传输文件时发生输入/输出错误。
-
SWF 尝试将文件上载到要求身份验证(如用户名和密码)的服务器。在上载期间,Flash Player 不提供用户用于输入密码的方法。
-
url
参数包含无效协议。
FileReference.upload()
方法必须使用 HTTP 或 HTTPS。
Flash Player 不对需要身份验证的服务器提供完全支持。只有使用浏览器插件或 Microsoft ActiveX® 控件在浏览器中运行的 SWF 文件才可以提供一个对话框,来提示用户输入用户名和密码以进行身份验证,并且仅用于下载操作。对于使用插件或 ActiveX 控件进行的上载操作,或者使用独立或外部播放器进行的上载/下载操作,文件传输会失败。
若要以 ColdFusion 创建服务器脚本以接受来自 Flash Player 的文件上载,可以使用类似于以下内容的代码:
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />
此 ColdFusion 代码上载 Flash Player 发送的文件,并将其保存到 ColdFusion 模板所在的目录中以覆盖具有相同名称的任何文件。上面的代码显示接受文件上载所需的最低代码量;不应在生产环境中使用此脚本。理想情况下,添加数据验证可以确保用户仅上载接受的文件类型(例如图像),而不是上载可能危险的服务器端脚本。
下面的代码使用 PHP 说明文件上载,并且包含数据验证。该脚本将上载目录中的上载文件数限制为 10,确保文件小于 200 KB,并且只允许 JPEG、GIF 或 PNG 文件上载和保存到文件系统。
<?php
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server
echo exif_imagetype($_FILES['Filedata']);
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE)
{
move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']);
$type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']);
if ($type == 1 || $type == 2 || $type == 3)
{
rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']);
}
else
{
unlink("./temporary/".$_FILES['Filedata']['name']);
}
}
$directory = opendir('./images/');
$files = array();
while ($file = readdir($directory))
{
array_push($files, array('./images/'.$file, filectime('./images/'.$file)));
}
usort($files, sorter);
if (count($files) > $MAXIMUM_FILE_COUNT)
{
$files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT);
for ($i = 0; $i < count($files_to_delete); $i++)
{
unlink($files_to_delete[$i][0]);
}
}
print_r($files);
closedir($directory);
function sorter($a, $b)
{
if ($a[1] == $b[1])
{
return 0;
}
else
{
return ($a[1] < $b[1]) ? -1 : 1;
}
}
?>
可以使用
POST
或
GET
请求方法将附加变量传递到上载脚本。要将附加
POST
变量发送到上载脚本,可以使用下面的代码:
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse();
function selectHandler(event:Event):void
{
var params:URLVariables = new URLVariables();
params.date = new Date();
params.ssid = "94103-1394-2345";
var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm");
request.method = URLRequestMethod.POST;
request.data = params;
fileRef.upload(request, "Custom1");
}
function completeHandler(event:Event):void
{
trace("uploaded");
}
上面的示例创建一个将传递到远程服务器端脚本的 URLVariables 对象。在早期版本的 ActionScript 中,可以通过在查询字符串中传递值来将变量传递到服务器上载脚本。在 ActionScript 3.0 中,可以使用 URLRequest 对象将变量传递到远程脚本,该对象允许您使用
POST
或
GET
方法传递数据;因此,可以更轻松和更清晰地传递较大数据集。为了指定是使用
GET
还是使用
POST
请求方法来传递变量,可以将
URLRequest.method
属性相应设置为
URLRequestMethod.GET
或
URLRequestMethod.POST
。
在 ActionScript 3.0 中,还可以通过向
upload()
方法提供第二个参数来覆盖默认
Filedata
上载文件字段名称,如上面的示例所示(该示例使用
Custom1
替换默认值
Filedata
)。
默认情况下,Flash Player 不尝试发送测试上载,虽然您可以通过将值
true
作为第三个参数传递给
upload()
方法来覆盖此默认行为。测试上载的目的是检查实际文件上载是否会成功,如果需要服务器身份,还会检查服务器身份验证是否会成功。
注:
目前,只在基于 Windows 的 Flash Player 上进行测试上载。
处理文件上载的服务器脚本应收到包含下列元素的 HTTP
POST
请求:
下面是一个 HTTP
POST
请求范例:
POST /handler.asp HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
User-Agent: Shockwave Flash
Host: www.mydomain.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name="Filename"
sushi.jpg
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg"
Content-Type: application/octet-stream
Test File
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name="Upload"
Submit Query
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
(actual file data,,,)
下面的 HTTP
POST
请求范例发送三个
POST
变量:
api_sig
、
api_key
和
auth_token
,并使用自定义上载数据字段名的值
"photo"
:
POST /handler.asp HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
User-Agent: Shockwave Flash
Host: www.mydomain.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
sushi.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="api_sig"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="api_key"
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="auth_token"
XXXXXXXXXXXXXXXXXXXXXXX
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="photo"; filename="sushi.jpg"
Content-Type: application/octet-stream
(actual file data,,,)
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Upload"
Submit Query
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--