QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

[VS2005 ASP.NET VB]FileUploadコントロールとOpenFileDialog

0 PV

何時もお世話になっております。

OSはWindowsXPのHome、現在開発環境でローカルのみで動かしています

ファイルのアップロードについて2点、ご教授願いたい事がございます

OpenFileDialogを使用して選択されたファイルをアップロードすると言う機能を実現させようとしており
機能自体はFileUploadコントロールを用い実現する事は出来ました

しかし、ポストバックが発生するたびに入力がリセットされると言う動作について
何とか出来るならばもちろんしたい

何とか出来ないなら、それなりの説明が必要と言う状態です
(仕様上かなりのポストバックが発生するため)

ポストバックのたびに入力がリセットされるのは
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1854&forum=7

上記スレッドを読み
INPUT TYPE=FILEタグとFileUploadコントロールの動作はその点に関して同じ動きだと、私は捕らえているので

ブラウザの実装としてセキュリティ面からそうしていないとい
又は、HTMLの仕様と言う説明方法が妥当ではないかと思いました

途中でbiacさんが言われているように単純なHTMLを作成しValueを設定しても反映されない為

上記理由により、ポストバック時に、FileUploadコントロールの入力をサーバー側で保持し、処理終了後、それを入力エリアに返して再表示すると言う流れは無理だと捕らえています

それがINPUT TYPE=FILEタグとFileUploadコントロールのどちらともで出来ないので有れば、TextBoxを使用して同様の処理を実現できないのかと言う話になると考えられるのですが

OpenFileDialogは下記掲示板の書込みにて、ASP.NETでは使用できないと理解しました
http://oshiete1.goo.ne.jp/qa1177204.html

どうしてもそれで実現するのであればDialogのスタイルのページを自分で作成するしかないのではと言う結論に、自分の中で至っています

以上の理由から、PostBack時の入力リセットはOpenFileDialogを使用する上で、回避しようの無い現象だと考えているのですが

どこかに見落とし又は、間違って理解している部分は無いでしょうか??

2点目は入力に関してなのですが
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42905&forum=28&9
上記スレッドによりINPUT TYPE=FILEタグは入力できなくすると言う制限をかけれる事を知りました

しかしFileUploadコントロールに関してはonKeyDownが無い為、同様の処理を加える事が出来ませんでした

入力されたファイルの存在チェックはサーバー側で行っている為、サブミットされれば問題ないのですが

ファイルパスの形式と違う入力がなされた時に、サブミット出来ないと言う問題をどう解決しようかと言う点で悩んでいます

入力できなくする事が出来れば、仕様上問題は無いのでそれが一番単純な解決方だと思うのですが、その点についてアドバイスがありましたらご教授願いします

以上2点になりますが、何かアドバイスありましたらよろしくお願いしたいたします。

----------------------------------------------------------------------------
失礼な話なのですが、biacさんとnsfjさんを間違えていたので訂正いたしました
もうしわけありませんでした
[ メッセージ編集済み 編集者: エイジ 編集日時 2008-07-22 18:29 ]

質問者:エイジ

回答

連投申し訳ありません

1つ目の点に関して入力保持について、仕様上の理解が正しいかどうかは引き続きアドバイスいただきたいのですが

UpdatePanelコントロールと言うのを見つけ、これによりポストバックが発生する箇所を限定する事により実現出来るのではないかと考えました

前にAJAXを導入について1度リーダーが躊躇していたので
再度、リーダーやお客様と検討を行った上での話になりますが

それが進めばこれを用い実現してみようと思っています

投稿者:エイジ

編集 履歴 (0)

エイジさんの書き込み (2008-07-22 17:57) より:

2点目は入力に関してなのですが

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42905&forum=28&9

上記スレッドによりINPUT TYPE=FILEタグは入力できなくすると言う制限をかけれる事を知りました

しかしFileUploadコントロールに関してはonKeyDownが無い為、同様の処理を加える事が出来ませんでした

とりあえずここだけ。



protected void Page_Load(object sender, EventArgs e)
{
    FileUpload1.Attributes.Add("onKeyDown", "return false;");
}

# 自分のたてたスレッドが出てくるのって感慨深いものが

投稿者:rain

編集 履歴 (0)

rainさん

ありがとうございます!
Loadイベントで追加する事が出来るのを見落としていました

ソースを見たことはあっても、自分が使ったことのない事は思い浮かばない現状を何とかしなければいけませんね・・・

約2年前のrainさんの記事が有ったからこそ、取っ掛かりを見つけることが出来た状態ですので、重ね重ねお世話になりました

ありがとうございました!

投稿者:エイジ

編集 履歴 (0)

ちょっと気になったので・・・

【キー入力抑止について】
FileUpload1.Attributes.Add("onContextmenu", "return false;");
も、しておくと良いと思います。(コンテキストメニューによる貼り付け防止)
*JavaScript-offにされたら、どうしようもありませんがね・・・。

【AJAX-UpdatePanelについて】
ポストバックする部分ってのがポストバックしても
ポストされるデータはUpdatePanel内に限定されますが、大丈夫でしょうか?
つまりUpdatePanel外にあるFileUploadコントロールにて指定されたファイルは
アップロードされません。

FileUploadに入力された値を消さずにサーバーにファイルを送信したい場合は
・ポストするだけに留める
・レスポンスを別ウィンドウまたはiFrameで受け取る(Formのtargetを変更する)
として、Submitしなければ駄目だと思います。

投稿者:くまっち

編集 履歴 (0)

くまっちさん

ありがとうございます
返信遅くなりまして申し訳ありません

確かにコンテキストメニューによる貼付が生きてました・・・
Ctrl+vでの張り付け確認してそちらを見落としていました・・

付け加えて実装させていただきます

AJAXについては、やはり上が導入はしない方向で行こうとしているので
動きについては確認できないままです・・

入力された値を消さずにファイルを送信したいと言う形でなく
ファイルを送信を必要としない(アップロードボタン以外のボタン押下時や、TreeViewコントロールのノード選択時)Submitの時にFileUploadコントロールの値が消えるを防ぎたいと言う形です

説明がわかりづらく申し訳ありません

アップロード後、入力はクリアされるので問題は無く、アップロードボタン押下時にFileUploadを含むUpdatePanelをポストバックさせ

その他のボタンなどの機能を纏めて別のUpdatePanelに配置する事で、ポストバックする箇所を分けれないかと考えました

つまり、ボタンが2つアップロードと選択ボタンが有るとして

アップロードボタンと、FileUploadコントロールを配置したUpdatePanelコントロールと

選択ボタンとTreeViewコントロールを配置したUpdatePanelコントロールをそれぞれ1画面に置く

そうする事で、FileUploadコントロールに入力された値はファイルアップロードボタンが押された時のみポストバックが発生し、その時のみ入力がクリアされるんじゃないかと言う考えです

しかし、上がAJAXは無しで行こうと考えているので別の手段が無いのかと言うところを突き詰める事になりそうなのですが

くまっちさんのおっしゃる

FileUploadに入力された値を消さずにサーバーにファイルを送信したい場合は
・ポストするだけに留める
・レスポンスを別ウィンドウまたはiFrameで受け取る(Formのtargetを変更する)
として、Submitしなければ駄目だと思います。

この手法で何とかならないのか、追っていこうと思います
FileUploadコントロールの部分だけ別のaspxでフレームを分けて実装できないかと言う考え方です

ご教授ありがとうございました!

投稿者:エイジ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。