- - PR -
asp2.net(VB.net 2005)にて、サーバ上のファイルの一覧取得・ダウンロード
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-03 10:47
お世話になります。asp.net初心者です。
ftpにて、サーバのフォルダーにアップされたデータを、asp.netにて一覧表示・ダウンロード できるように考えています。 下記のコードを参考(ダウンロード部)にしましたが、ローカル(IIS)では、ダウンロードできますが、サーバ上(レンタルサーバ)にて転送して、試したところ、パスがレンタルサーバパス+ローカルIISパスとなり、うまくいきません。 根本的に間違っている様にも思えますが、ご指導下さい。 Dim strFile As String strFile = lstFile.SelectedValue If strFile <> "" Then Response.ContentType = "application/octet-stream" Response.AddHeader("Content-Disposition", "inline;filename=" & strFile) Response.Flush() Response.WriteFile(strFile) Response.End() End If asp2.net から直接FTPを指定して、ダウンロードできるサンプルを試しましたが、 WebExceptユーザコードがハンドルされませんとエラーが出ます。 以上、よろしくお願いします。 | ||||||||
|
投稿日時: 2006-08-03 12:16
こんにちは。
レンタルサーバからローカルの IIS のパスが勝手に見えるわけはないので、パスが「レンタルサーバパス+ローカルIISパス」となるように書かれたコードがあるはずです。 その辺りをご確認ください。 _________________ 上本亮介 (ue) @ わんくま同盟 Microsoft MVP for VSTO (Jul 2008 - Jun 2009) Hello Another World! .NET 勉強会 / ヒーロー島 | ||||||||
|
投稿日時: 2006-08-03 15:15
ueさん 返信ありがとうございます。
特にコードに記述は無いようですが、気になる点として、 新規作成時にローカルIISで作成している点です。 これをFTPで転送し、ブラウザより表示しています。 この点に問題有りでしょうか? リモートサーバに新規作成を試みた場合、FontPage Server Extentionsが設定されていない と表示されます。 よろしくお願いします。 | ||||||||
|
投稿日時: 2006-08-03 22:55
ここだけ眺めていても問題は(あるようにも思うけど、とりあえず)無い。 ここではなく、lstFile.SelectedValue を、どうやって作っているかが問題。この中に、すでに「サーバ上のパス + ローカルでのパス」の形で入っているのだろうから、まずそれを探す。 というより、クライアントにサーバのパスを送っちゃいかん!! エラー(例外)情報は、デバッグのための重要な情報。略したりおおよそで書くのではなく、きちんと、一字一句そのままコピーする。 | ||||||||
|
投稿日時: 2006-08-04 10:43
Jittaさん 返信ありがとうございます。
いろいろ調べたところ、サーバ側のアクセス権の問題でした。 (全くの素人で、すみません。ご指摘ありがとうございました。) ところで、根本的に問題があるかどうか、お尋ねします。 システムの概要ですが、 遠隔(山中)に置かれた、測定器のデータ(400kbyte CSV型)を1日1回、携帯電話(9.6kbps)にてダイヤルアップ接続し、レンタルサーバへアップ(FTP)できるシステムです。 問題として、サーバにアップされたデータの閲覧・ダウンロード方法です。 最初は、FFFTPにて、簡単にダウンロードを考えていましたが、自身以外の操作として、 Webから、ダウンロードの検討を行いました。 一般的に今回の方法でサーバへアップされたデータは、どう扱えばいいですか? データベースに追記アップですか? FTPにて、追加ファイルとしてアップですか? ASP.netを使い、簡単に処理できる方法として、どちらが適切でしょうか? ご指導お願いします。 | ||||||||
|
投稿日時: 2006-08-06 22:18
サーバにアップロードされた、ファイル名だけ返すのは、何ら問題ありません。
クライアントが欲しいのはファイル名と、それがいつアップロードされたかぐらいで、サーバ上の詳細な格納場所は、いらないですよね? FTP で接続するときも、ユーザのホーム ディレクトリ以下のディレクトリ名は欲しいかもしれませんが、ユーザのホーム ディレクトリがどこかまでは、いらないですよね? あとは、どのようにダウンロードさせるかによります。 | ||||||||
|
投稿日時: 2006-08-07 08:46
Jittaさん 返信ありがとうございます。
サンプル等を参考にとりあえず動く、形になりました。 コード: Imports System.Net Imports System.IO Imports System.Web.UI Partial Class _Default Inherits System.Web.UI.Page DIM FP as String Dim strpath As String Protected Sub btnDownload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownload.Click strpath = Server.MapPath("指定フォルダ") Dim strFile As String strFile = lstFile.SelectedValue If strFile <> "" Then FP = strpath & strFile Try Response.ContentType = "application/octet-stream" Response.AppendHeader("Content-Disposition", "attachment;filename=" & HttpUtility.UrlEncode(strFile)) Response.Flush() Response.WriteFile(FP) Response.End() Catch End Try End If End Sub Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click rem フォルダ内ファイル表示 strpath = Server.MapPath("指定フォルダ") lstFile.Items.Clear() 'クリアー Dim strFiles() As String Dim strFile As String '取得したファイル名を表示する Try strFiles = Directory.GetFiles(strpath) For Each strFile In strFiles lstFile.Items.Add(Path.GetFileName(strFile)) Next Catch lstFile.Items.Clear() End Try End Sub End Class この様な方法で、問題ありますか? | ||||||||
|
投稿日時: 2006-08-07 23:12
おおむね問題はないと思いますが、いくつか細かいところを。
まず、「この様な方法で、問題ありますか?」と尋ねるときは、ソース コードだけでなく、コードで何をさせたいのかも併記してください。 Insider.NET 掲示板の質問を見ている限り、エラーや例外が発生するのは、やりたいことと実装がずれているケースが多いです。単にコードだけ出されても、何をしたくてそう書いたのかがわからなければ、おそらく間違っているであろうことの半分しか見えないからです。 これはマイクロソフトの“バグ”といってもいいことですが、try catch finally 構文で、ほとんどの場合 catch ブロックは必要ありません。むしろ、finally ブロックの方が必要です。 今回(これはコードが提示されているからわかることですが)、
この2箇所の catch ブロックは必要ありません。lstFile は、try より前にクリアしてしまえば、、、っつうか、やってるやん。 また、2つとも例外を“握りつぶして”いますが、開発中はそれによって直すべきところがわからなくなり、実運用でも「エラーは出ないのにダウンロードできない(リストが出ない)」という、事態を招きます。混乱の元です。 もっとも、「他のコードは省略しました」ということなら必要なのかもしれませんが、それは書いていないのでわかりません(なので、「意図」も併記して欲しい)。 FP = strpath & strFile ですが、System.IO.Path.Combine を使いましょう。将来的にパス区切り文字がバックスラッシュから他の文字に変更になったときも、コードを修正する必要がありません。また、Linux へ持って行っても、そのまま動きます(Linux のパス区切り文字はスラッシュです)。 ダウンロードさせているところですが、まず、Response をクリアしましょう。何も入っていないはずだけど、念のため。 |