Om du vill överföra filer till en server anropar du först metoden
browse()
så att användaren kan välja en eller flera filer. Sedan, när metoden
FileReference.upload()
anropas, överförs den valda filen till servern. Om användaren väljer flera filer med hjälp av metoden
FileReferenceList.browse()
skapar Flash Player en array med de valda filerna vid namn
FileReferenceList.fileList
. Du kan sedan använda metoden
FileReference.upload()
för att överföra varje fil för sig.
Obs!
Metoden
FileReference.browse()
gör att du bara kan överföra enskilda filer. Om du vill tillåta att användare kan överföra flera filer använder du metoden
FileReferenceList.browse()
.
Som standard kan användare välja valfri filtyp på den lokala datorn i dialogrutan för att välja fil. Utvecklare kan ange en eller flera anpassade filtypsfilter genom klassen FileFilter och skicka en array av filterinstanser för filer till metoden
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);
När användaren har valt filer och klickat på knappen Öppna i systemets filväljare, skickas händelsen
Event.SELECT
. Om metoden
FileReference.browse()
används för att välja filen som ska överföras skickas filen till en webbserver med följande kod:
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");
}
Du kan skicka data till servern med metoden
FileReference.upload()
genom att använda egenskaperna
URLRequest.method
och
URLRequest.data
för att skicka variabler med hjälp av metoden
POST
eller
GET
.
När du försöker överföra en fil med hjälp av metoden
FileReference.upload()
skickas följande händelser:
-
open
event (
Event.OPEN
): Skickas när överföringen startar.
-
progress
event (
ProgressEvent.PROGRESS
): Skickas regelbundet allt eftersom byte med data överförs.
-
complete
event (
Event.COMPLETE
): Skickas när överföringen har slutförts.
-
httpStatus
event (
HTTPStatusEvent.HTTP_STATUS
): Skickas när överföringen misslyckas på grund av ett HTTP-fel.
-
httpResponseStatus
event (
HTTPStatusEvent.HTTP_RESPONSE_STATUS
): Skickas om ett anrop till metoden
upload()
eller
uploadUnencoded()
försöker få åtkomst till data via HTTP, och Adobe AIR upptäcker och returnerar statuskoden för begäran.
-
securityError
-händelse (
SecurityErrorEvent.SECURITY_ERROR
): Skickas om en överföring misslyckas på grund av en säkerhetsöverträdelse.
-
uploadCompleteData
event (
DataEvent.UPLOAD_COMPLETE_DATA
): Skickas när data har tagits emot från servern efter en slutförd överföring.
-
ioError
event (
IOErrorEvent.IO_ERROR
): Skickas om överföringen misslyckas på grund av någon av följande orsaker:
-
Ett in-/utdatafel inträffade när Flash Player läser, skriver eller skickar filen.
-
SWF-filen försökte att överföra en fil till en server som kräver verifiering (till exempel användarnamn och lösenord). Under överföring kan inte användaren ange lösenord i Flash Player.
-
Parametern
url
innehåller ett ogiltigt protokoll. Metoden
FileReference.upload()
måste använda antingen HTTP eller HTTPS.
Flash Player erbjuder inte fullständigt stöd för servrar som kräver verifiering. Bara SWF-filer som körs i en webbläsare med hjälp av webbläsarplugin-programmet eller Microsoft ActiveX®-kontrollen kan erbjuda en dialogruta där användaren uppmanas att ange användarnamn och lösenord för verifiering, och då bara för nedladdning. För överföring med plugin-programmet eller med ActiveX-kontrollen och för överföring/nedladdning med en fristående eller extern spelare misslyckas filöverföringen.
Om du vill skapa ett serverskript i ColdFusion för att godta en filöverföring från Flash Player kan du använda kod som följande:
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />
Den här ColdFusion-koden överför filen som har skickats av Flash Player och sparar den i samma katalog som ColdFusion-mallen. Om katalogen redan innehåller en fil med samma namn, skrivs den filen över. Ovanstående kod visar den minsta mängd kod som krävs för att godta en filöverföring. Skriptet bör inte användas i verkliga produktionsmiljöer. Bäst är att lägga till datavalidering för att se till att användare endast överför giltiga filtyper, till exempel en bild i stället för ett potentiellt farligt serverskript.
Koden nedan visar filöverföringar med hjälp av PHP, och inkluderar datavalidering. Skriptet begränsar antalet överförda filer i överföringskatalogen till 10, vilket garanterar att filen är mindre än 200 kB, och tillåter bara att JPEG-, GIF- och PNG-filer överförs till och sparas i filsystemet.
<?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;
}
}
?>
Du kan skicka ytterligare variabler till överföringsskriptet med hjälp av förfrågningsmetoden
POST
eller
GET
. Om du vill skicka ytterligare
POST
-variabler till överföringsskriptet kan du använda följande kod:
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");
}
Ovanstående exempel skapar ett URLVariables-objekt som du skickar till fjärrskriptet på servern. I tidigare versioner av ActionScript kunde du skicka variabler till överföringsskriptet på servern genom att skicka värden i frågesträngen. I ActionScript 3.0 kan du skicka variabler till fjärrskriptet med hjälp av ett URLRequest-objekt, som låter dig skicka data med metoden
POST
eller
GET
, vilket i sin tur gör det möjligt att enkelt och smidigt skicka större mängder data. För att kunna ange om variablerna skickas med förfrågningsmetoden
GET
eller
POST
kan du ställa in egenskapen
URLRequest.method
på
URLRequestMethod.GET
respektive
URLRequestMethod.POST
.
I ActionScript 3.0 kan du även åsidosätta standardfältnamnet på överföringsfilen,
Filedata
, genom att ange en andra parameter för metoden
upload()
, som i föregående exempel (som ersatte standardvärdet
Filedata
med
Custom1
).
Flash Player gör som standard inte någon testöverföring, men du kan kringgå detta genom att skicka värdet
true
som en tredje parameter till metoden
upload()
. Syftet med testöverföringen är att kontrollera att den riktiga filöverföringen och serververifieringen (om någon) kommer att lyckas.
Obs!
Testöverföring går än så länge bara att göra på Windows-baserade Flash Player.
I serverskriptet som hanterar filöverföringen bör en HTTP
POST
-begäran ingå med följande element:
-
Content-Type
med värdet
multipart/form-data
.
-
Content-Disposition
med ett
name
-attribut inställt på
Filedata
och ett
filename
-attribut inställt på originalfilens namn. Du kan ange ett anpassat
name
-attribut genom att skicka ett värde för parametern
uploadDataFieldName
i metoden
FileReference.upload()
.
-
Filens binära innehåll
Här följer ett exempel på en HTTP
POST
-begäran:
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,,,)
Följande exempel på HTTP
POST
-begäran skickar tre
POST
-variabler:
api_sig
,
api_key
och
auth_token
, och använder ett anpassat namnvärde för överföringsdatafält (
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--