kagamihogeの日記

kagamihogeの日記です。

Flex から絶対パス指定でファイルアップロードはムリっぽい

こんな感じのことはやれるのかな? と思ったわけですよ。

Flex から Servlet にファイルアップロード を少し前に書いた。ただ、ファイルの絶対パスを自分で指定してファイルアップロードすることは出来ない。また、ファイルの絶対パスを表示することもできない*1。これは flash.net.FileReference の仕様というか Flash Player からローカルのパス見れちゃセキュリティ的にまずいだろうから当然といえば当然なんだけど。IE6 はコレが出来るので、Flex でも出来ないもんかと試みてみましたが……結論としてはムリということになりましたが。

まず、Flex からは逆立ちしても絶対パスは見れない。なので、ファイルアップロードを externalInterface 経由で javascript にやらせることは出来ないか、と考えた。

イメージ的にはこんな感じ。

まず Flex 側。こっちはただ単に ExternalInterface 経由で javascript の関数呼んでいるだけ。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:util="util.*">
    <mx:Script>
        <![CDATA[
            private function clicked():void {
                absname.text = ExternalInterface.call("fileRef");
            }
            
            private function upload():void {
                ExternalInterface.call("uploadJavasc");
            }
        ]]>
    </mx:Script>

<mx:TextInput id="absname" width="463"  x="10" y="10"/>
<mx:Button click="clicked()" label="参照" x="481" y="10"/>
<mx:Button click="upload()" label="アップロード" x="537" y="10"/>

</mx:Application>

javascript と HTML のフォームはこんな感じ。

function fileRef() {
    document.fileform.file1.click();
    return document.getElementById("file1").value;
}

function uploadJavasc() {
    document.fileform.submit();
}
<form name="fileform" method="POST" enctype="multipart/form-data" 
        action="ultest" >
ファイルパス:
<input name="file1" type="file" size="75" />
<input name="submit1" type="submit" value="アップロード" />
</form>

fileRef() で、ブラウザのファイル選択ダイアログを開く・Flex 側にパスを渡す、は出来た。が、uploadJavasc() の javascript で submit してるとこで「アクセスが拒否されました」というエラーが出る。[html]<input type="file">タグの参照ボタンを画像ボタンにした時のsubmitの方法 - HTML - 教えて!goo などを見てる限り回避策は無いっぽい。というかまぁ、コレが出来てしまうと、下手すると javascript から任意のファイルアップロードできちゃうような気がするからなぁ。出来なくて当然というか……

更に言うと fileRef() で絶対パスが取得できるのも、IE6 独特の動作。FirefoxでFormのfileでファイルのパスが取得できない | PHPのQ&A【OKWave】 に書いてあるように、Firefox だと「hoge.txt」みたいにファイル名だけしか取得できない。まぁこっちも当然といえば当然ですわな。

Flex Sample - ファイルアップロード・のサンプル を見ると、VBScript と併用してやれば出来るようなこと書いてある。でも、このサンプルも form.submit() やってるんだよなぁ。昔の IE とかなら出来たってことなのかな?

当然っちゃ当然なんですが、やっぱ Flex からローカルファイルどーのこーのはちと制限がありますな。いやまぁ「絶対パスで入力・表示」を諦めればいい話でもあるのだけど。

…… AIR 使えりゃなぁw

*1:ただし Flash Player10 と AIR ならタブンできる