- PR -

asp2.net(VB.net 2005)にて、サーバ上のファイルの一覧取得・ダウンロード

投稿者投稿内容
いっち
会議室デビュー日: 2006/08/02
投稿数: 8
投稿日時: 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ユーザコードがハンドルされませんとエラーが出ます。
以上、よろしくお願いします。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-08-03 12:16
こんにちは。

引用:

下記のコードを参考(ダウンロード部)にしましたが、ローカル(IIS)では、ダウンロードできますが、サーバ上(レンタルサーバ)にて転送して、試したところ、パスがレンタルサーバパス+ローカルIISパスとなり、うまくいきません。


レンタルサーバからローカルの IIS のパスが勝手に見えるわけはないので、パスが「レンタルサーバパス+ローカルIISパス」となるように書かれたコードがあるはずです。
その辺りをご確認ください。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
いっち
会議室デビュー日: 2006/08/02
投稿数: 8
投稿日時: 2006-08-03 15:15
ueさん 返信ありがとうございます。

特にコードに記述は無いようですが、気になる点として、
新規作成時にローカルIISで作成している点です。

これをFTPで転送し、ブラウザより表示しています。
この点に問題有りでしょうか?

リモートサーバに新規作成を試みた場合、FontPage Server Extentionsが設定されていない
と表示されます。

よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-03 22:55
引用:

いっちさんの書き込み(2006-08-03 10:47)より:
コード:
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


ASP.NET 2.0 から直接FTPを指定して、ダウンロードできるサンプルを試しましたが、
WebExceptユーザコードがハンドルされませんとエラーが出ます。
以上、よろしくお願いします。


 ここだけ眺めていても問題は(あるようにも思うけど、とりあえず)無い。
 ここではなく、lstFile.SelectedValue を、どうやって作っているかが問題。この中に、すでに「サーバ上のパス + ローカルでのパス」の形で入っているのだろうから、まずそれを探す。

 というより、クライアントにサーバのパスを送っちゃいかん!!


 エラー(例外)情報は、デバッグのための重要な情報。略したりおおよそで書くのではなく、きちんと、一字一句そのままコピーする。
いっち
会議室デビュー日: 2006/08/02
投稿数: 8
投稿日時: 2006-08-04 10:43
Jittaさん 返信ありがとうございます。

いろいろ調べたところ、サーバ側のアクセス権の問題でした。
(全くの素人で、すみません。ご指摘ありがとうございました。)

ところで、根本的に問題があるかどうか、お尋ねします。

システムの概要ですが、
遠隔(山中)に置かれた、測定器のデータ(400kbyte CSV型)を1日1回、携帯電話(9.6kbps)にてダイヤルアップ接続し、レンタルサーバへアップ(FTP)できるシステムです。

問題として、サーバにアップされたデータの閲覧・ダウンロード方法です。
最初は、FFFTPにて、簡単にダウンロードを考えていましたが、自身以外の操作として、
Webから、ダウンロードの検討を行いました。

一般的に今回の方法でサーバへアップされたデータは、どう扱えばいいですか?

データベースに追記アップですか?
FTPにて、追加ファイルとしてアップですか?

ASP.netを使い、簡単に処理できる方法として、どちらが適切でしょうか?

ご指導お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-06 22:18
サーバにアップロードされた、ファイル名だけ返すのは、何ら問題ありません。
クライアントが欲しいのはファイル名と、それがいつアップロードされたかぐらいで、サーバ上の詳細な格納場所は、いらないですよね?
FTP で接続するときも、ユーザのホーム ディレクトリ以下のディレクトリ名は欲しいかもしれませんが、ユーザのホーム ディレクトリがどこかまでは、いらないですよね?

あとは、どのようにダウンロードさせるかによります。
いっち
会議室デビュー日: 2006/08/02
投稿数: 8
投稿日時: 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


この様な方法で、問題ありますか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-07 23:12
おおむね問題はないと思いますが、いくつか細かいところを。


 まず、「この様な方法で、問題ありますか?」と尋ねるときは、ソース コードだけでなく、コードで何をさせたいのかも併記してください。
 Insider.NET 掲示板の質問を見ている限り、エラーや例外が発生するのは、やりたいことと実装がずれているケースが多いです。単にコードだけ出されても、何をしたくてそう書いたのかがわからなければ、おそらく間違っているであろうことの半分しか見えないからです。

 これはマイクロソフトの“バグ”といってもいいことですが、try catch finally 構文で、ほとんどの場合 catch ブロックは必要ありません。むしろ、finally ブロックの方が必要です。
 今回(これはコードが提示されているからわかることですが)、
コード:
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

Try 
	strFiles = Directory.GetFiles(strpath) 
	For Each strFile In strFiles 
		lstFile.Items.Add(Path.GetFileName(strFile)) 
	Next 
Catch 
	ここ
	lstFile.Items.Clear() 
End Try


この2箇所の catch ブロックは必要ありません。lstFile は、try より前にクリアしてしまえば、、、っつうか、やってるやん。
 また、2つとも例外を“握りつぶして”いますが、開発中はそれによって直すべきところがわからなくなり、実運用でも「エラーは出ないのにダウンロードできない(リストが出ない)」という、事態を招きます。混乱の元です。
 もっとも、「他のコードは省略しました」ということなら必要なのかもしれませんが、それは書いていないのでわかりません(なので、「意図」も併記して欲しい)。

 FP = strpath & strFile ですが、System.IO.Path.Combine を使いましょう。将来的にパス区切り文字がバックスラッシュから他の文字に変更になったときも、コードを修正する必要がありません。また、Linux へ持って行っても、そのまま動きます(Linux のパス区切り文字はスラッシュです)。

 ダウンロードさせているところですが、まず、Response をクリアしましょう。何も入っていないはずだけど、念のため。

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