ファイルのアップロード

(サンプル一覧を表示する)

FlashDevelop を使って、ファイルをアップロードするテストをしてみました。

このサンプルでは、サーバの都合上、ファイルサイズを 2 MB に制限しています。
Flash Player 自体は、 100 MB までアップロード可能なようです (バージョン 9 の場合)。

サーバ側のスクリプトのサンプル (PHP)

ファイルのアップロード

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

ファイルのアップロード

最近アップロードされたファイル

間違えてアップロードしてしまった場合は、
5 つほど不要なファイルをアップロードして ログを流してください。

ソースコード

package 
{
	import flash.display.CapsStyle;
	import flash.display.LineScaleMode;
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.ProgressEvent;
	import flash.net.FileFilter;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	
	/**
	 * ファイルをアップロードするサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * 結果表示用テキストフィールド
		 */
		private var textField:TextField;
		
		/**
		 * ボタン
		 */
		private var button1:SimpleButton;
	
		/**
		 * ボタンのラベル
		 */
		private var buttonText1:TextField;
		
		/**
		 * ファイル参照オブジェクト
		 */
		private var fileReference:FileReference;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化イベント
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// 結果表示用テキストフィールド
			textField = new TextField();
			textField.autoSize = TextFieldAutoSize.CENTER;
			textField.selectable = false;
			textField.x = 160;
			textField.y = 70;
			textField.text = "ボタンを押すと、ファイルのアップロードを開始します。";
			addChild(textField);
			
			// ボタンのラベルの作成
			buttonText1 = new TextField();
			buttonText1.autoSize = TextFieldAutoSize.CENTER;
			buttonText1.selectable = false;
			buttonText1.x = 160;
			buttonText1.y = 110;
			buttonText1.text = "アップロード";
			addChild(buttonText1);
			
			// ボタンの作成
			button1 = new SimpleButton();
			button1.upState = makeRoundRect(0xDDDDDD, 100, 20, 10);
			button1.overState = makeRoundRect(0xFFFFFF, 100, 20, 10);
			button1.downState = makeRoundRect(0xBBBBBB, 100, 20, 10);
			button1.hitTestState = button1.upState;
			button1.addEventListener(MouseEvent.MOUSE_DOWN, onButtonMouseDown);
			button1.x = 110;
			button1.y = 110;
			addChild(button1);
		}

		/**
		 * ボタンが押された時のイベントハンドラ
		 * @param	event
		 */
		private function onButtonMouseDown(event:MouseEvent):void
		{
			fileReference = new FileReference();
			
			// イベントの登録
			fileReference.addEventListener(Event.SELECT, onSelect);
			fileReference.addEventListener(Event.OPEN, onOpen);
			fileReference.addEventListener(ProgressEvent.PROGRESS, onProgress);
			fileReference.addEventListener(Event.COMPLETE, onComplete);
			
			// ファイル選択ダイアログを表示する
			var fileFilter:FileFilter = new FileFilter("画像ファイル (jpg, gif, png)", "*.jpg;*.gif;*.png");
			fileReference.browse([fileFilter]);
		}
		
		/**
		 * ファイル選択イベント
		 * @param	event
		 */
		private function onSelect(event:Event):void
		{
			var url:String = "http://hikipuro.is-a-geek.org/flash/game/sample/s055/upload.php";
			var urlRequest:URLRequest = new URLRequest(url);
			
			// 選択されたファイルのアップロードを開始する
			fileReference.upload(urlRequest);
		}
		
		/**
		 * アップロード開始イベント
		 * @param	event
		 */
		private function onOpen(event:Event):void
		{
			// プログレスバーをクリアする
			graphics.clear();
			
			// 線の色と太さを決める
			graphics.lineStyle(10, 
							   0xff8888, 
							   1.0,
							   false, 
							   LineScaleMode.NORMAL, 
							   CapsStyle.NONE);
		}
		
		/**
		 * アップロード進行中イベント
		 * @param	event
		 */
		private function onProgress(event:ProgressEvent):void
		{
			// プログレスバーを描く
			var ratio:Number;
			ratio = event.bytesLoaded / event.bytesTotal;
			
			graphics.moveTo(10, 150);
			graphics.lineTo(10 + ratio * 300, 150);
			
			// テキストフィールドの更新
			textField.text = "アップロード中です。 : " + Math.floor(ratio * 100) + " %";
		}
		
		/**
		 * アップロード完了イベント
		 * @param	event
		 */
		private function onComplete(event:Event):void
		{
			textField.text = "アップロードが完了しました。";
		}
		
		/**
		 * 角丸の図形を描いたスプライトを作って返す
		 * @param	color	色
		 * @param	width	幅
		 * @param	height	高さ
		 * @param	round	角丸の大きさ
		 * @return	スプライト
		 */
		private function makeRoundRect(color:uint, width:int, height:int, round:int):Sprite
		{
			var s:Sprite = new Sprite();
			s.graphics.lineStyle(2);
			s.graphics.beginFill(color);
			s.graphics.drawRoundRect(0, 0, width, height, round);
			s.graphics.endFill();
			s.alpha = 0.3;
			return s;
		}
		
	}
	
}		

このサンプルでは、IO Error イベントに対応する処理を書いていません。
実際にアップローダを作る時は追加したほうが良いと思います。

リンク