- PR -

[VS2005 ASP.NET VB]サーバー側のファイルをIEでオープン

1
投稿者投稿内容
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-18 09:39
何時もお世話になっております。

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

まずTreeViewを使いサーバーのフォルダを階層表示し
そのノードがクリックされたタイミングで

フォルダかファイルかを判定し、ファイルなら新たにIEを開き別ウィンドウで
TreeViewで選択されたファイルをオープンする

と言う処理を実現しようとしています


まず試みたのが

str = "<SCRIPT LANGUAGE='javascript'>"
str &= "var objWindow = window.open('" & URL & "','','toolbar=no,location=no,status=no,directories=no,menubar=no,scrollbars=yes,resizable=no');"
str &= "objWindow.focus();"
str &= "</SCRIPT>"

page.ClientScript.RegisterStartupScript(page.GetType, "OpenNewWindow", str)

上記コードでURLの変数に、ファイルのフルパスを入れると言う処理を試したのですが
JavaScriptのエラーが出て新しいウィンドウが開きませんでした


その後
下記掲示板の記述を見つけ
http://bbs.wankuma.com/index.cgi?mode=al2&namber=1633&KLOG=10

引用
□投稿者/ ぼのぼの (7回)-(2007/03/01(Thu) 13:10:54)

あ、もいっこやり方がありますね。

1.A.aspxがwindow.open()でB.aspxを開く
2.B.aspxのLoadイベント内でファイル出力{ここではExcelとします}
3.B.aspxで2.の後にResponse.Redirect("ファイル×パス--<訂正>-->○URL")


と言う方法で実現できないか考えてみました


まずテスト的に
新しいWebページを作成し

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Response.Redirect("C:\Documents and Settings\USER\My Documents\a.xls")
End Sub

ページロードのイベントでこのような形でファイルパスを記述するとオープンは出来ませんでした

上記引用3の
B.aspxで2.の後にResponse.Redirect("ファイル×パス--<訂正>-->○URL")

部分でファイルパスは×
URLを書けといわれているのだと思うのですが、この場合どういった形でURLを指定したらよいのでしょうか?


思いつくのは
IIS上に上がってる部分に作業フォルダの様な物を作成し、その都度指定されたファイルをそこにコピーし、そこのURLを指定すると言う方法なのですが

何かアドバイス有りましたらご教授願いします


以上、よろしくお願いいたします
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-18 10:07
上記作業フォルダへのコピーで

直接URLを指定しwindow.openで開くと言うコードを考え

  Protected Sub TreeView1_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.SelectedNodeChanged
    Try
      Dim strItem As String = sender.SelectedNode.Value
      If InStr(strItem, ".") <> 0 Then
        Dim strUrl As String = Directory.GetCurrentDirectory & "\file" & Mid(strItem, InStrRev(strItem, "\"), Len(strItem))
        System.IO.File.Copy(strItem, strUrl)

        Dim str As String = "<SCRIPT LANGUAGE='javascript'>"
        str &= "var objWindow = window.open('" & URL & "','',' _
          toolbar=no,location=no,status=no,directories=no,menubar=no,scrollbars=yes,resizable=no');"
        str &= "objWindow.focus();"
        str &= "</SCRIPT>"

        page.ClientScript.RegisterStartupScript(page.GetType, "OpenNewWindow", str)
      End If
    Catch ex As Exception

    End Try
  End Sub

上記コードを書いたのですが

Directory.GetCurrentDirectory

で、取ってこれるディレクトリが

"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE"

となり、プロジェクトのフォルダに作成した作業フォルダが出来てなく

System.IO.File.Copy(strItem, strUrl)

この部分でフォルダが無いと言うエラーになりました・・



サーバー側で実行した場合も同じように作業フォルダが取得できないものなのでしょうか?

Webページの場合別の手法でフォルダPathを取得する形になるのでしょうか??


あわせて何かアドバイス有りましたらお願いいたします


-------------------------------------------------------------
って書いてから気付きました・・・

結局Path指定しても意味無いですよね・・・

Dim strItem As String = sender.SelectedNode.Value
Dim strUrl As String = "http://localhost:2214/webpage/file/" & Mid(strItem, InStrRev(strItem, "\") + 1, Len(strItem))

上記のように
現在のhttp://localhostのポート番号からを直接指定しなおして実行してみました

すると下記エラーメッセージが表示されました
URI フォーマットはサポートされていません。

このエラーについてはコピーする方法が間違っているのかと思いこれから、サーバーへのファイルアップロード方法について調べてみようと思います


取り急ぎ訂正させていただきます。

[ メッセージ編集済み 編集者: エイジ 編集日時 2008-07-18 10:18 ]
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-18 16:16
機能的には下記コードで実現させる事が出来ました

  Protected Sub TreeView1_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.SelectedNodeChanged
    Try
      Dim strItem As String = sender.SelectedNode.Value
      If InStr(strItem, ".") <> 0 Then
        Dim strUrl As String = "http://localhost:2214/file/" & Mid(strItem, InStrRev(strItem, "\") + 1, Len(strItem))
        Dim strServerPath As String = Directory.GetCurrentDirectory & "\file\" & Mid(strItem, InStrRev(strItem, "\") + 1, Len(strItem))

        System.IO.File.Copy(strItem, strServerPath)

        Dim str As String = "<SCRIPT LANGUAGE='javascript'>"
        str &= "var objWindow = window.open('" & URL & "','',' _
          toolbar=no,location=no,status=no,directories=no,menubar=no,scrollbars=yes,resizable=no');"
        str &= "objWindow.focus();"
        str &= "</SCRIPT>"

        page.ClientScript.RegisterStartupScript(page.GetType, "OpenNewWindow", str)
      End If
    Catch ex As Exception

    End Try
  End Sub


ただ1つ思ったのが
System.IO.File.Copy(strItem, strServerPath)

このコードでサーバー側にファイルをコピーする事が出来るのかと言う点です


これはローカルの実行環境だから上手く動作してるだけなんじゃないかと言うのが心配なんですが、現在サーバーに上げてのテスト環境が作れず確証が得られない状態です



来週頭にはサーバーに上げて実行しテストすることが出来るのですが
それまでに何かわかることがありましたら引き続きアドバイスお願いいたします
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-07-18 23:42
Server.MapPath
とか?
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-19 09:58
ぴあちゃんさんありがとうございます

Server.MapPathについてしらべてみました

Server.MapPathと言うのは
wwwサービスの中にすでにファイルの物理Pathを取得するもとという認識で間違いないですよね?

ファイル自体はサーバー側のローカルフォルダの任意の場所にあるため
wwwサービスの中に存在しているわけでなく

その為、TreeViewで指定されたファイルをwwwサービスの中にコピーしそれを指定すると言う手法をとって見ています



まとめると

1.IEで開くため ファイルのURLを取得したい

2.ファイル自体はTreeViewコントロールを使用しサーバー側の任意のフォルダにある

3.その為wwwサービス内にない可能性があるので
  wwwサービス内の指定したフォルダにファイルをコピーしURLで指定できるようにする


上記3を実現させるために
System.IO.File.Copy(対象ファイルの物理パス, wwwサービス内の指定ファイルの物理パス)
と言う形で、ファイルをwwwサービス内へとコピーする

そうすることでURLが決まるので、そのURLを指定する

という手法を取っています


System.IO.File.Copy(対象ファイルの物理パス, wwwサービス内の指定ファイルの物理パス)
と言うのが本番で使用できるのかと言うのが気にかかっていましたが

よく考えれば、サーバー側PCのローカルフォルダから、サーバー側のPCのローカルフォルダへコピーするだけなので使用できそうなきがしてきました(笑)

まぁそれは週明けテストしてみないといけませんが・・^^;



ですので、Server.MapPathを使用して物理Pathを取得というのは無くても
ファイルの物理パス自体はTreeViewコントロールから指定され取得するので問題ないと思われます


しかしServer.MapPath自体を知らなかったので勉強になりました
ありがとうございました!
1

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