- PR -

【ASP.NET】リストボックスによるアップロードについて

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-26 21:40
みなさん、お騒がせしております(^_^;)

aspx ファイルには、

<INPUT language="vb" id="filGet1" type="file" name="filGet" runat="server">

があり、クライアント側のフルパス(C:\\\\hoge\\\\hogehoge.csv)を取得し、画面にある「追加」ボタンを押すと、リストボックスにファイルのフルパスを追加する仕組みになっています。
(リストボックスには、ファイルのフルパスが追加されます)

<イメージ>
C:\hoge\hogehoge.csv
C:\hoge\hogehoge2.csv
C:\hoge\hogehoge3.csv

<追加ボタン押下時 処理>
lstFile.Items.Add(filGet1.PostedFile.FileName)
配列.Add(filGet1.PostedFile.FileName)

で、画面の「アップロード」ボタンを押すと、問題の処理を行ないます。

コード:
Dim lo_HIF As System.Web.UI.HtmlControls.HtmlInputFile

For Each lo_HIF In 配列
  ls_FileName = System.IO.Path.GetFileName(lo_HIF.PostedFile.FileName)
  lo_HIF.PostedFile.SaveAs(String.Format(ConfigurationSettings.AppSettings("serverpath")) & ls_FileName)
Next



配列は、Session変数に入れて持ち回っており(理由は不明)、どうせフルパスを取得するならリストボックスから直接取得すればいいじゃん、と思った次第です。

分かっていただけましたでしょうか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-05-26 21:59
なるほど。それを先に言わないと。。皆さんも私も混乱してしまいましたよ。

最終的な目的はファイル保存なんですよね?

「アップロード」押下時、ファイルの内容自体はセッションにあるんだから、
クライアントでのパスがわかってもあまり意味がありません。
よって、このFor Eachの部分は、現状でそんなに問題ないと思いますよ。 (配列の要素をHtmlInputFileにするかはおいといて)
(ボタン押下時、確実にセッションが保持されているかもおいといて)

処理的にはリストボックスの方が不要で、ユーザーに見せるためだけに使ってる
ってことですよね?「アップロード」と言いながら、実はファイルはもうサーバーに
あって、実際は「保存してくれ」ボタンてことですよね。

# 私だったら<input type="file" />を沢山用意しますけどねー。

[ メッセージ編集済み 編集者: べる 編集日時 2006-05-26 22:11 ]
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-26 22:14
引用:

べるさんの書き込み (2006-05-26 21:59) より:

なるほど。それを先に言わないと。。皆さんも私も混乱してしまいましたよ。

最終的な目的はファイル保存なんですよね?


現在している処理の最終的な目的は、クライアントから取得したファイルのデータをDBに登録することです<既に実現済み>。
しかし、私が今回目的としているのは、Session変数を使わず、リストボックスの値を利用したい、ということです。

引用:

「アップロード」押下時、ファイルの内容自体はセッションにあるんだから、
クライアントでのパスがわかってもあまり意味がありません。
よって、このFor Eachの部分は、現状でそんなに問題ないと思いますよ。
(配列の要素をHtmlInputFileにするかはおいといて)


今回の目的は、配列(セッション変数)を使わず、リストボックスから直接ファイル名を取得することです。

引用:

処理的にはリストボックスの方が不要で、ユーザーに見せるためだけに使ってる
ってことですよね?「アップロード」と言いながら、実はファイルはもうサーバーに
あって、実際は「保存してくれ」ボタンてことですよね。

# 私だったら<input type="file" />を沢山用意しますけどねー。


いいえ、違います(違うと思います<ちょっと弱気w>)。
「追加」ボタンは、単にリストボックスにファイル名を追加するだけで、サーバへのアップロードは行なっていません。
現状では、「アップロード」ボタンが押されたタイミングで、セッション変数の配列を利用してサーバへ一括アップロードしています。

SaveAs のタイミングで、サーバへのアップロードが行なわれると理解していますが、間違っているのでしょうか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-26 22:24
引用:

かるあさんの書き込み (2006-05-26 19:51) より:
あれ?、アップロードしたファイルの一覧を
リストボックスに入れたいのではなくて

リストボックスにあるファイルパスの一覧をサーバに
アップロードしたいんじゃないでしょうか


リストボックスの値を配列に格納して、それを・・・ということだったので、最初にリストボックスに格納する時点で・・・と考えたわけです(^▽^;)
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-05-27 00:55
引用:
現在している処理の最終的な目的は、クライアントから取得したファイルのデータをDBに登録することです<既に実現済み>。
しかし、私が今回目的としているのは、Session変数を使わず、リストボックスの値を利用したい、ということです。

なるほど。いずれにしてもファイルの[中身]まで必要なのですよね。

引用:
今回の目的は、配列(セッション変数)を使わず、リストボックスから直接ファイル名を取得することです。

よっぽど特殊なことしてない限り(思いつきませんが)、リストボックスに書いてある
ファイルがサーバーに転送されることはないと思います。

引用:
「追加」ボタンは、単にリストボックスにファイル名を追加するだけで、サーバへのアップロードは行なっていません。

それなら
引用:
<追加ボタン押下時 処理>
lstFile.Items.Add(filGet1.PostedFile.FileName)
配列.Add(filGet1.PostedFile.FileName)

このときPostedFile.SaveAsしてみてください。多分できるはずです。

でも良く見たら、確かに「配列」にはstringしかAddしていませんね。
↓こうじゃないですか??(じゃないとFor Eachのとき型が合わないと思います。。)
配列.Add(filGet1);

引用:
SaveAs のタイミングで、サーバへのアップロードが行なわれると理解していますが、間違っているのでしょうか?

多分ですが、間違っています。
サーバー側のコードによって能動的にクライアントに何かをさせること(この場合
アップロード)は普通できません。

IeHttpHeadersかなんかで通信の内容を見てみるといいかもしれません。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-05-27 01:29
引用:

ひろれいさんの書き込み (2006-05-26 21:40) より:
<追加ボタン押下時 処理>
lstFile.Items.Add(filGet1.PostedFile.FileName)
配列.Add(filGet1.PostedFile.FileName)

で、画面の「アップロード」ボタンを押すと、問題の処理を行ないます。

コード:
Dim lo_HIF As System.Web.UI.HtmlControls.HtmlInputFile

For Each lo_HIF In 配列
  ls_FileName = System.IO.Path.GetFileName(lo_HIF.PostedFile.FileName)
  lo_HIF.PostedFile.SaveAs(String.Format(ConfigurationSettings.AppSettings("serverpath")) & ls_FileName)
Next




ちょっと確認ですが、ほんとにこの通りのコードで動いてるんですか?
どう見てもっていうか全く動くとは思えないんですが…
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-05-27 02:02
ひろれいさん、こんばんは。

引用:

「追加」ボタンは、単にリストボックスにファイル名を追加するだけで、サーバへのアップロードは行なっていません。


「追加」ボタンのクリックイベント・ハンドラって、どこで動作してます?
あれはクライアントサイドの VbScript ではなくて、サーバサイドの vb.net のコードですよね? ってことは、「追加」ボタンをクリックする事によってポストバックが発生しているわけです。

で、その時、<input type="file" />に値がセットされている(ファイルへのパスが表示されている)のであれば、間違いなくアップロードは行われています。
何と言っても、PostedFile (ポストされたファイル)の FileName が取得できているのがその証拠です。

ですから、以下のべるさんの発言通りの処理が行われているものと思われます。

引用:

べるさんの書き込み (2006-05-26 21:59) より:
処理的にはリストボックスの方が不要で、ユーザーに見せるためだけに使ってる
ってことですよね?「アップロード」と言いながら、実はファイルはもうサーバーに
あって、実際は「保存してくれ」ボタンてことですよね。



恐らく、最終的にリストの内容を確認して、確定するまで保留しておく必要があって、このような処理になっているのでしょうね。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-29 10:21
みなさん、おはようございます。
色々と検証しており、お返事が遅れました。申し訳ございません。

皆様のおかげで、やっと中身が見えてきました(^_^;)
べるさんのお考えの通り、セッション変数にファイルオブジェクトを入れていました。

引用:

でも良く見たら、確かに「配列」にはstringしかAddしていませんね。
↓こうじゃないですか??(じゃないとFor Eachのとき型が合わないと思います。。)
配列.Add(filGet1);


確かに、filGet1 を配列にセットしておりました。申し訳ございません。
要は、べるさんのお考えの通り、リストボックスはユーザへ見せるための表示だけに過ぎず、内部的にはセッション変数に filGet1 を詰め込み、それを利用しているみたいですね。これだと、私が考えていたリストボックスの利用は出来ませんね・・・

なちゃさんに「本当に動くの?」と言われたことで、再確認して気付きましたm(_ _)m

引用:

多分ですが、間違っています。
サーバー側のコードによって能動的にクライアントに何かをさせること(この場合
アップロード)は普通できません。

「追加」ボタンのクリックイベント・ハンドラって、どこで動作してます?
あれはクライアントサイドの VbScript ではなくて、サーバサイドの vb.net のコードですよね? ってことは、「追加」ボタンをクリックする事によってポストバックが発生しているわけです。
で、その時、<input type="file" />に値がセットされている(ファイルへのパスが表示されている)のであれば、間違いなくアップロードは行われています。
何と言っても、PostedFile (ポストされたファイル)の FileName が取得できているのがその証拠です。


こちらにつきましては、やはり、「アップロード」ボタンが押された SaveAs時にサーバ側へアップロードされます。クイックウォッチで確認したので間違いありません。

べるさんのお考えの通り、私も
引用:

(ボタン押下時、確実にセッションが保持されているかもおいといて)


という点が気になっており、セッション変数の利用は止めたいと考え、今回の質問の通り、何か他の手(私はリストボックスが使えないかと考えたわけですが)はないかと思った次第です。

やはり、変えるなら、べるさんのおっしゃる通り、画面に複数セットしておくしか無いのでしょうか・・・

スキルアップ/キャリアアップ(JOB@IT)