2008/11/09

Flexでのファイルアップロードの例

Flex・PHPでFile Uploadするコンポーネントとを紹介。





Flexでのファイルアップロードのデモへのリンク
ソースコードはデモのページを右クリック⇒"View Source"で。

元ネタは⇒Uploading Files with Flex and PHP

ただこのサイトのmxml/actionscriptのコードには誤りがないのですがPHPのソースコード中に誤りがあります↓↓


<results>
<success><?=$success;?></success>
<?=$data;?>
<?=echo_errors($errors);?>
</results>
<?
}

function echo_errors($errors) {

for($i=0;$i<count($errors);$i++) {
?>
<error><?=$errors[$i];?></error>
<?
}

}


↑の部分はXMLとPHPの部分をはっきり分ける必要があるので
例えば<?=$success;?>となってるところは<?php echo $success;?>としなければいけません。よって正しくは


<results>
<success><?php echo $success;?></success>
<?php echo $data;?>
<?php echo_errors($errors);?>
</results>
<?php
}

function echo_errors($errors) {

for($i=0;$i<count($errors);$i++) {
?>
<error><?php echo $errors[$i];?></error>
<?php
}

}


以下注意点とPHPの全体のコードです。

○Uploadするフォルダは書き込み可にする。

○PHPのソースコード中のうpするフォルダへのパスを正しく記述する。

○MXMLのソースコード中のPHPファイルへのパスを正しく記述する。


<?php

$errors = array();
$data = "";
$success = "false";

function return_result($success,$errors,$data) {
echo("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
?>
<results>
<success><?php echo $success;?></success>
<?php echo $data;?>
<?php echo_errors($errors);?>
</results>
<?php
}

function echo_errors($errors) {

for($i=0;$i<count($errors);$i++) {
?>
<error><?php echo $errors[$i];?></error>
<?php
}

}

switch($_REQUEST['action']) {

case "upload":

$file_temp = $_FILES['file']['tmp_name'];
$file_name = $_FILES['file']['name'];

//アップロードするディレクトリのパス
$file_path = "/home/toshi/public_html/map/up/myFileDir";

//checks for duplicate files
if(!file_exists($file_path."/".$file_name)) {

//complete upload
$filestatus = move_uploaded_file($file_temp,$file_path."/".$file_name);
if(!$filestatus) {
$success = "false";
array_push($errors,"Upload failed. Please try again.");
}

}
else{
$success = "false";
array_push($errors,"File already exists on server.");
}

break;

default:
$success = "false";
array_push($errors,"No action was requested.");

}

return_result($success,$errors,$data);

?>

2 Comment:

匿名 さんのコメント...

有用な情報ありがとうございます。さて、PHP側での処理ですが、どうも何もしなくても、onUploadComplete(event:Event)が呼ばれて、アップロード成功とのメッセージが出る気がします。もっといえば、up.phpがなくても、きちんとアップしたようなメッセージが出るようですが、PHP側の処理をFlexに渡すにはどうすればいいでしょうかね?

toshi さんのコメント...

返事が大変遅くなって申し訳ないです。そして本ブログの最初のコメント誠にありがとうございます!

昨日このコメントに気づきいろいろ考えてみましたが…

今のこのコードの状態では

例えばup.phpがない又はパスが正しくない場合、アップロード成功のメッセージが成功しなくても成功と出るかもしれませんが、up.phpをパスを正しくして設置してあればアップロードが成功していなければエラーのメッセージが出ると思います。

またご指摘の通り、PHP側でよりきちんとアップロードを完了したということを確認・証明してそのことを送信するというコードを付け加える、ってするのがベストな改善策であることは確かです。


ただその改善策が僕も今はまだ具体的にどうしたらいいかわからないのでこれから考え・勉強して方法を見つけたいと思います。

今回は良い御指摘ありがとうございました!!