プロが教えるわが家の防犯対策術!

ASP初心者です。
下記のようにサーバのローカル上に保存されたCSVファイルをクライアントの方にダウンロードさせるにはどうしたらいいでしょうか?
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objText = objFS.CreateTextFile("C:\" & rizu_id2 & ".csv")
objText.WriteLine("リスト種別,親種別,指図番号,枝番,ユーザ名,リスト来歴番号,リスト来歴日付,内容,リスト来歴作成者,リスト来歴承認者,AN-80,DIC547(旧色),日塗工S44-257(安全色),日塗工S44-257(梯子手摺),指定色:本体,安全色,梯子手摺,制御盤外面色,制御盤内面色,リレー板色,艶有り,半艶,親機種コード,親名称,親図面番号,親型式,作成年月,図面リスト作成者,図面リスト承認者,電源電圧,50Hz,60Hz,操作電圧,特記事項")
objText.WriteLine(""& ristsyu & "," & osyu & "," & sashi & "," & edaban & "," & yumei & "," & rirano & "," & riradate & "," & na & "," & ritanto & "," & risyonin &"," & an & "," & dic & "," & nitosa & "," & nitola & "," & mainc & "," & safec & "," & lad & "," & contout & "," & contin & "," & rico & "," & gloss & "," & hgloss & "," & okisyu & "," & oname & "," & ozu_id & "," & okata & "," & yerman & "," & tanto & "," & syo & "," & po & "," & hzg & "," & hzr & "," & op & "," & ct &"")
objText.WriteLine("順序,子図面番号,子サイズ,子分類コード,子種別,子名称,子型式,単数,製作数,子備考,子来歴番号")
objText.WriteLine(""& fla & "," & kzu & "," & ksize & "," & kbu & "," & ksyu & "," & koname & "," & kkata & "," & ksu & "," & sei & "," & kbi &"," & krai & "")
objText.Close

以上、宜しくお願い致します。

A 回答 (4件)

#2です、こんにちは。



リンクタグで、拡張子がCSVをダウンロードする場合は、ユーザに左クリックさせないことが重要です^^;
IEの場合は、右クリックして【対象をファイルに保存】して下さい、等書かないと前述した個々のクライアントの環境の問題が出ます。

私が開発した時は「左クリックでCSVをダウンロードできないか。」という要望が顧客から出て、
プログラムでブラウザを判定して、ブラウザごとにロジックを変えて対応しましたが、、、
ブラウザのバージョンが変わるたびに、ブラウザの動きが変わったりするので、メンテナンスが大変ですし、想定外のブラウザでの誤動作も怖いですし。


> その中で、リンクというと<A HREF~が思いつくのですが、
> サーバ保存したファイル名をどのようにして見つければ良いのかわかりません。


保存場所は、もちろんわかるんですよね?
実行ファイル(asp)とCSVファイルが同じフォルダ内でしたら
<a href='a.csv'>ダウンロード</a>

別のフォルダの場合。
例えば、C:\Inetpub\wwwroot\a.aspを実行していて、C:\Inetpub\a.csvをダウンロードする場合は
<a href='../a.csv'>ダウンロード</a>

C:\Inetpub\wwwroot\a.aspを実行していて、C:\Inetpub\wwwroot\data\a.csvをダウンロードする場合は
<a href='data/a.csv'>ダウンロード</a>


外部公開しているサーバでしたら、ダウンロード後は削除するようなロジックを入れる方がセキュリティ的に○ですね。
    • good
    • 0
この回答へのお礼

どうも有難う御座いました。無事解決致しました。これからもっと勉強を行い邁進していきます。今後とも宜しくお願い致します。

お礼日時:2004/09/17 07:49

#2です。


補足ありがとうございました。
私の方が難しく考えすぎたのかも^^;
質問の通りだったのですね。


ダウンロードさせる際は、サーバにファイル出力後に、
サーバ保存したファイルを自動的にダウンロードさせる、ということでしょうか。
リンクをクリックしてもらう、という手法ではないんですよね?

サーバに保存したものを自動的にダウンロード~というやり方は、私の知る限りではないと思います。
頑張ればできますが、、、


1)WriteLineでサーバ保存
2)ReadLine等で(1)のファイルを開いて読み込み、octet-streamで出力してクライアントにダウンロードさせる。


このような格好悪い方法でしたら、可能ですが、、、
(#1さんのやり方と同じになります。)


CSVの話は、対象となるクライアントによって動きが変わってきます。
業務端末のような環境が絞られているクライアントならいいのですが、
どんな環境でも動くようにCSVをダウンロードする、というのはおそらく不可能でしょう。
同じOSでも、Officeのバージョンによって動きが変わったりもします。
拡張子を変更してdat等にすると、問題なくダウンロードさせることが可能だったりします。

この回答への補足

御回答有難う御座いました。
本当のところは、サーバにファイル出力後に、サーバ保存したファイルを自動的にダウンロードさせる事が出来れば最高なのですが、非常に難しいという事ですので、回答の中にも記載して頂いているリンクをクリックしてもらう方法で作成したいと考えております。
行いたい内容として、
1.あるボタンをクリックすると、サーバ側のあるフォルダに、CSVファイルを作成します。(仮にこれをA.CSVとします。)
2.次に画面が変わって、A.CSVファイルのリンクボタンが表示されるようにする。
3.最後にエンドユーザにてそのリンクボタンをクリックしてもらい、所望のフォルダにA.CSVファイルを保存してもらう。
その中で、リンクというと<A HREF~が思いつくのですが、サーバ保存したファイル名をどのようにして見つければ良いのかわかりません。
申し訳ありませんがご教授の程宜しくお願い致します。

補足日時:2004/09/14 13:03
    • good
    • 0

こんにちは。


CSVには散々悩まされている開発者です(苦笑
拡張子がCSVのファイルをダウンロードさせるのは、やっかいですよ^^;


> おっしゃる通り行ってみましたが、ダウンロードさせたCSVファイルを確認すると、
> リンクのようになってしまってカンマ区切りにならなくなってしまいました。

これじゃ、ちょっと障害の状況がつかめないのですが。。。
どちらにしろ、#1さんのやり方はサーバに保存しない方法ですので。。。



あなたの質問は、質問の意図がよくわかりません^^;
具体的にどういう障害が出ているのでしょうか。
あなたが質問したいことは、何ですか?
【ダウンロードさせるにはどうしたらいいでしょうか?】
だけですと、わかりません。。。


・ファイルをサーバ上に保存できないんですか?
・クライアントで保存できないんですか?
・クライアントでファイルのリンクをクリックすると、勝手に開いてしまうのですか?

あなたの書いたソースを使えば、おそらくサーバ上に保存するところまではできると思いますが、、、


以上、補足要求でした。

この回答への補足

すみません。説明不足で申し訳ありません。以後気をつけます。
早速ですが、補足させて頂きます。行いたい事は、下記の通りです。

1.あるボタンをクリックすると、サーバ側のあるフォルダに、CSVファイルを作成します。(仮にこれをA.CSVとします。)
2.さらに、サーバ側で作成されたA.CSVファイルを、クライアント側にダウンロードという形で、CSVファイルを保存します。

1.については、おっしゃる通りサーバ上に保存は出来ていますが、2.においては、全く解らない状態で行き詰まっています。

実際のところ全く解っておらず、思考錯誤している状況にあります。
以上、宜しくお願い致します。

補足日時:2004/09/13 19:00
    • good
    • 0

 「サーバのローカル上に保存された」と書かれてあるが、実際これはASP内で動的に作成して保存しているのでは? もし可能ならば、サーバのローカル上にいったん保存せずに、作成したCSVデータを直接クライアントに送りつけてはどうだろうか。

いかに簡単なサンプルを示す。



' クライアントに対するレスポンスをHTMLではなく汎用オクテットストリームとして返す
Response.ContentType="application/octet-stream"
' ダウンロードさせるファイル名を指定
Response.AddHeader "Content-Disposition","attachment; filename=" & rizu_id2 & ".csv"
' CSVの内容は普通にResponse.Writeで。つまり、君が書いたサンプルと比べると、ファイルに対して書き込むか、HTTPレスポンスに対して書き込むかの違いとなる。ストリームの概念考えた人にはノーベル賞やね。
Response.Write (CSVの内容~~~~)
' 終了
Response.End



 もしそれでもいったんサーバに保存させたければ、書き込みを同時に行っても良いだろうし、CSVを作るスクリプト(君が作ったやつ)とそのCSVを読み込んでダウンロードさせるスクリプト(サンプルを参考にCSVを読み込んでオクテットストリームとして返してあげるのを作ってね)を用意すれば良いだろう。

この回答への補足

早速の御回答有難う御座いました。おっしゃる通り行ってみましたが、ダウンロードさせたCSVファイルを確認すると、リンクのようになってしまってカンマ区切りにならなくなってしまいました。
又、サーバとクライアント両方にCSVファイルが必要の為、動的に作成したCSVファイルをクライアントにダウンロードする必要があります。ご指摘のCSVを作ったスクリプトの後にそのCSVを読み込んでオクテットストリームとして返す方法がわかりません。
何卒、ご教授宜しくお願い致します。

補足日時:2004/09/13 10:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!