- - PR -
画像パスの取得方法
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-20 01:53
フルパスがわかれば解決できる問題と考えてらっしゃいますか?
|
|
投稿日時: 2008-11-20 03:34
ありがとうございます。
恐らく、セキュリティ的な問題が強いため、各ブラウザもファイル名だけの受け渡しになったように思いますが、現在製作中のアプリはほとんどsubmitを行わない非同期通信の画面遷移のプログラムです(ログイン・ログアウトのみsubmit)。 何とか実現したいのですが、フルパスがどうしても取得できず、こちらに辿り着きました。その為IE6では実現できてますが・・、他はダメです・・。 何か良い手がありましたらよろしくお願いします。 |
|
投稿日時: 2008-11-20 18:58
<form>
<input type=file name=upload><button onclick="alert(this.form.upload.value)"> </form> 何を悩んでいるのかいつもよくわからないんですけど・・・ chrome でクライアントのフルパス取れましたよ。 hidden に入れて、ポストするだけじゃ? なるほど、やるかどうかはあなた次第ですが、今思いついた方法はこんな感じです。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE></TITLE> </HEAD> <BODY> <form target="frame1"> <input type=file name=upload><button onclick="alert(this.form.upload.value)">AAA</button> <button onclick="alert(document.getElementById('frame1').contentWindow.location.href)">OSU</button> </form> <iframe src="" name="frame1" id="frame1"></frame> </BODY> </HTML> これの location.href からURLエンコードされているパスを抽出してくらはれ。 [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-20 19:09 ] |
|
投稿日時: 2008-11-20 19:14
だから、手順としては、
(1)フォームのメソッドを POSTからGETに一時的に変更する。 (2)ターゲットを IFRAMEに変更する。 (3)フォームの アクションをブランクor 実在する適当な HTML にする。 (4)IFRAMEの onload にイベントを追加する(このフォームの本来のポスト先用)。 で、IFRAMEにポストする。 (5)onload に追加されたイベントから、フォームの hidden 要素に、 URLデコードして抽出したクライアントのフルパスを設定して、 (1)から(3)の変更を元に戻して、POSTする。 こんなんでどうでせう? 1つ前のレスの 「なるほど」以下は、Firefox3では、ファイル名しか 取れなかったことへの自分宛のレスです。。。 さらに追記とお詫び: Firefox3ではどーやってもフルパスは取れないですね。。。 IE でいう、window.external みたいに Firefox3 でも出来るから、Java つつけ ば取れそうな気がするけど、未検証です。 ということでごめんなさい。 [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-20 19:15 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-20 19:35 ] |
|
投稿日時: 2008-11-20 22:07
ぴあちゃんさん、ありがとうございます。
おっしゃるようにdocument.form.file.valueでIE6 & Safari3.1 & Chorome0.3では、フルパスが取得できますが、FireFox3ではだめですね(IE7は確かめてませんが)。 Javaで取得できるかもしれないと言うのは、どのようにするのでしょうか?ファイル名だけからの検索だと同一ファイルとかの重複もありそうで試していませんが(getabsolutePath()はだめでした)。 FireFox3のform-submitでどのように、このFileが動作しているのか見てみましたら、サーバアプリのカレントディレクトリにtmpファイルで一度アップロードしている?或いはlinkさせている?、どちらか分かりませんが、getFileのフルパスを見る限りそのようでした。 |
|
投稿日時: 2008-11-20 22:37
もしかしてですが、
1.ファイルフィールドからファイル名を取得して送信 2.サーバ側でファイル名を取得 3.サーバ側でフルパスのファイル名からjava.io.Fileのインスタンス生成 4.そのファイルの処理 ということをやろうとしています? そして、フルパスならどうにかなると考えているということは、 開発中であるため、サーバとクライアントが同じ端末であり、 そういう条件下において偶々うまく動いているように見えた。ということですかね。 サーバとクライアントが違う場合、 サーバ側でc:/aaa/bbb/ccc.txtなんてパスを受け取ったところで、 サーバからクライアントのファイルを取りに行く事は出来ません。 (LAN内でNETBIOS経由とか、専用クライアントとか、特殊環境は除く) 逆にそんなことできたら、他人のPCを覗き放題です。 普通に考えてオカシイと思いませんか? |
|
投稿日時: 2008-11-21 10:13
・・そうですね。
今、このようにfileが無かったら、画面側でパラメータfileNmaeにフルパスを指定して UPLOADしようとしてました。 try { File fl = this.getFile(); // Fileが無い場合絶対パスで取得 if (fl == null && this.getFileName().length() > 0) { String abpath = new File(this.getFileName()); fl = new File(abpath); } if (!fl.exists()) { throw new Exception("ファイルが存在しません。"); } else if (fl.length() == 0) { throw new Exception("ファイルサイズが0バイトです。"); } func_FileUpload(fl, uploadpath); } catch (Exception ex) { //アップロードエラー ex.printStackTrace(); } 確実にfileには受けわたってこないので、そうするとJavaではファイルをどう認識するのでしょうか?今までform-postばかりでやってまして、そういえばおっしゃるとおりですね・・。根本的に間違っていますね。 |
|
投稿日時: 2008-11-21 11:05
見えないiframeをDOMなどで動的に生成して、
そのiframeをターゲットにフォーム送信すれば、 画面遷移なしにファイルアップロードができます。 その送信されたiframeの画面の中のonloadイベントで、 アップロード結果を親へ通知すれば、Ajaxぽくなります。 |