- ベストアンサー
CSVファイルの開くボタンをクリックした際にエラーが発生する
- Windows2000 SP4 + ASPの環境でCSVファイルのダウンロード機能を作成しています。ダウンロードダイアログが表示され、保存ボタンをクリックすると正常に保存されますが、開くボタンをクリックすると"出力ファイル名[1].csv"が見つからないエラーが発生します。
- ダウンロードロジックでは、Response.ContentTypeを"application/octet-stream"に設定し、Response.AddHeaderでファイル名を指定しています。また、ダウンロードするファイルのパスを指定し、ADODB.Streamオブジェクトを使用してファイルを読み込んでいます。
- エラーの原因は現在のコードでは特定できませんが、ファイルの保存先やファイル名の指定に問題がある可能性があります。解決策としては、保存先やファイル名の指定を見直し、正しいパスやファイル名を使用することが考えられます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
すみません、私が聞きたかったのは、「もちろんダウンロードできません。」とおっしゃる部分、具体的にはどう言う状況なのか、です。 ダウンロードダイアログが表示され、ファイル名がおかしいだけで、なぜダウンロードできないのか、そのまま「OK」をクリックすると、エラー表示が出るのか、その表示内容は?、などが知りたかったのです。 いろいろ気になるところはありますが、とりあえず上記を教えていただけるでしょうか。
その他の回答 (5)
- taseki
- ベストアンサー率66% (155/233)
ANo.5のコードを試していただいたのは、原因を絞るためで、つまりサーバー側、クライアント側のどちらに原因があるのかを限定するためのものでしたが、その結果を見る限り、どうやらクライアント側に原因があるようですね。 > ということは、OS,IEなどにより動作がことなるということなのでしょうか? 私が試したところ、WinXP、98、ME、IE5.5、IE6、すべて問題ありませんでした。 なので、そのテストした環境だけの問題なような気がします。 直接的な原因は、キャッシュ保存されていないことが原因です。 見ていないので勘でしかありませんが、単にブラウザの設定によるだけに思えます。 Cache-Controlのno-cacheというのは「キャッシュ保存するな」という指定ですので消したのですが、消したにも関わらず、何らの理由でキャッシュ保存されていないようです。 そうなるとブラウザ設定のほうでキャッシュ保存しないようになっているのでは。 たとえば、IEの設定で、インターネット一時ファイルを「自動的に確認する」に設定、あるいはディスク領域が足りているかどうか、など。 また、同じマシンで別のブラウザでも試されると、より原因が絞られると思います。 あと、成功したWin2000のほうのIEの設定と比べてみる、など。
お礼
色々お教えいただきありがとうございました。 各種設定確認しまして、ご指摘の件に関しては 特におかしな点がみつかりませんでした。 更に探求を進めてみようと考えています。 ASPでの開発がまだ続きますので、また何かありましたら宜しくお願い致します。 この度は色々お世話になりました。ありがとうございました。
- taseki
- ベストアンサー率66% (155/233)
サーバーのエラーや、ファイル名指定がおかしいとか、「要求されたサイトが~」などのエラーなどは、とりあえず全てなくなったということですね? となると、出力に至る前の部分など、やはりごく単純なミスが原因のような気がしてしまいます。 以下で試すとどうですか? ※「C:\Inetpub\wwwroot\CoreSt\pp.csv」が存在し、エクセルで開けることを確認しておく ●ASP.Netの場合 <% Dim strFilePath strFilePath = "C:\Inetpub\wwwroot\CoreSt\pp.csv" Response.AddHeader "Content-Disposition","attachment; filename=pp.csv" Response.WriteFile strFilePath %> ●ASP <% Dim objStream Dim strFilePath Const adTypeBinary = 1 strFilePath = "C:\Inetpub\wwwroot\CoreSt\pp.csv" Response.AddHeader "Content-Disposition","attachment; filename=pp.csv" Set objStream = Server.CreateObject("ADODB.Stream") objStream.Open objStream.Type = adTypeBinary objStream.LoadFromFile strFilePath Response.BinaryWrite objStream.Read objStream.Close Set objStream = Nothing %> 上記は、とりあえず出力部分のみを、つまり原因を限定することが目的のものですので、変更せずにこのまま試してみてください。 また、他のブラウザや、他のPCから(ネットを介して)ではどうでしょうか。
補足
ご指摘頂いたソース<●ASP>をそのまま貼り付け 実行してみました。 するとクライアントによって以下のように動きが変化しました。 クアイアントがWinXP+SP2(IE6.0.29)の場合 これまでお話していた通りの現象(EXCELは起動されるのですが、エラーメッセージ【pp[1].csvが見つかりません】が出現します。)でした。 また、クライアントがWin2000(Server,Pro)+SP4(IE6.0.28)の場合 なんと正常にpp[1].csvがEXCELで起動され中身も正しいものが表示されました。 今回は全端末ともEXCEL2000で統一しております。 ということは、OS,IEなどにより動作がことなるということなのでしょうか? 度々申し訳ありません。 宜しくお願い致します。
- taseki
- ベストアンサー率66% (155/233)
まず > ADODB.Stream (0x800A0BBA) > ファイルを開けませんでした。 というエラーは、ASP側、サーバー側のエラーですよね。 ファイルを開けない、ファイルが見つからないということではないでしょうか。 「ファイル名をASCII文字だけにする」というのは、クライアントにダウンロードさせるファイルであって、サーバーがディスクから読み込むファイルではありません。 「pp.csv」に変更されたときに、 strFilePath = "C:\Inetpub\wwwroot\CoreSt\光彩.csv" ここも変えてしまいませんでしたか? ↑ あるいは、変えたなら当然、実際のディスク上のファイル「光彩.csv」も「pp.csv」という名前にリネームしておかなければなりません。 > Internet Explorer では、ListOut.aspを開くことができません というエラーは、単にクライアント側で拡張子「asp」に関連付けられたアプリがないということでしょう。 また、 > このインターネットのサイトを開くことができませんでした というエラーも、前述のようにサーバーが正しくファイルデータを返せないためです。 つまり、ダウンロードダイアログに表示されるファイル名の問題も、エラー表示も、そもそもそこまで行く前(ファイル読み込み)の時点でエラーが起きて、ヘッダも何も意味がなかった、というだけな気がします。 質問分に載せているコードを、 ~attachment; filename=光彩.csv という部分を、 ~attachment; filename=pp.csv に変更し、実際にサーバーのディスク上にあるファイル名を、 strFilePath = "C:\Inetpub\wwwroot\CoreSt\★" ↑この部分に入れて、実行してみてください。 また、先から出ているキャッシュの問題も、あわせて反映させ(Cache-Control:no-cache を書かない)、さらにクライアント側のディスクキャッシュを一度クリアしてみてはどうでしょうか(C:\WINDOWS\Temporary Internet Files の中をクリア)。
補足
度々ありがとうございます。 以下にご指摘に従い修正したロジックを転記します。 ****ロジック開始**** 'Response.AddHeader "Cache-Control", "no-Cache" Response.CharSet = "Shift_Jis" filename = "c:\Inetpub\wwwroot\CoreSt\pp.csv" Set fsobj = CreateObject("Scripting.FileSystemObject") Set tsObj = fsobj.CreateTextFile(filename,true) <filenameへCSV出力(長文のため省略)> tsObj.Close() Response.ContentType = "application/octet-stream" Response.AddHeader "content-disposition","attachment; filename=pp.csv" strFilePath = filename ←実際に上で設定したフルパスが入っていることは確認済み Set objStream = Server.CreateObject("ADODB.Stream") objStream.Open objStream.Type = adTypeBinary objStream.LoadFromFile strFilePath Response.BinaryWrite objStream.Read objStream.Close Set objStream = Nothing response.end ****ロジック終了**** この内容と伴に、クライアント側のディスクキャッシュのクリアを実施しました。(c:\windows\temp\ Temporary Internet Files & IEのインターネットオプションのインターネット一時ファイルの削除を実施) 結果動作に変わりはありませんでした。(Excelが起動された後、pp[1].csvが見つかりませんというエラー) 他に心当りありますでしょうか?宜しくお願い致します。
- taseki
- ベストアンサー率66% (155/233)
最も気になるのは、 > ファイル名を”pp.csv”等日本語を使用しないパターンにした場合、ダウンロ > ードダイアログで表示されるダウンロード対象ファイル名が、ロジック記述し > ているソース名(ListOut_asp)となってしまいます。(もちろんダウンロー > ドできません。) 「filename=~」を変えただけで、ダイアログのファイル名がおかしくなってしまうというのは、ちょっと考えられません。何か他も変えてませんか? また、「もちろんダウンロードできません。」も、ちょっと考えにくいです。ファイル名が「ListOut_asp」になってしまったとしても、なぜダウンロードできないのか、というより、ダウンロードできないとは具体的にはどう言うことですか?エラーが発生するということですか? それともうひとつ。 > no-Cacheを使用しない。また、inlineを指定すると、ブラウザにCSVがEXCELイ > メージで表示されてしまうため 「Cache-Control:no-cache 」を使用しないだけでは、上記現象にはなりませんよね? inline を指定した場合だと思います。 以下のような書式になっていれば良いとおもいます。 Content-Disposition: inline; filename=pp.csv 参照URLには、「キャッシュを制限しないことで問題を回避できる」とありますので、この点を確認してはどうでしょうか。 私も試してみたところ、キャッシュを制限していると、確かに、ダウンロードダイアログボックスで、「保存」を選ぶと問題なく、「開く」を選ぶとファイルが見つからない旨のエラーが表示されました。 ようするに、セッション内のみ有効となっているキャッシュが、「開く」の前処理の内部的なダウンロードが完了した時点で、削除されていることが原因だと思います。 キャッシュの制限をしなければ、問題なく開くことができました。
補足
度々すみません。 >「filename=~」を変えただけで、ダイアログのファ >イル名がおかしくなってしまうというのは、ちょっと>考えられません。何か他も変えてませんか? >また、「もちろんダウンロードできません。」も、ち>ょっと考えにくいです。ファイル名が >「ListOut_asp」になってしまったとしても、なぜダ >ウンロードできないのか、というより、ダウンロード>できないとは具体的にはどう言うことですか?エラー>が発生するということですか? ListOut.aspファイルに当ロジックをかいています。 この名前がなぜか「ListOut_asp」とダウンロードダイアログに表示されます。また、条件はやはりファイル名を、日本語名から、”pp.csv”にかえただけで現象が出てきます。(他は特に触っていません。) 実際の原因は、キャッシュの制限ではないかとのご指摘いただいた通りだと私も思い”no-cache”を指定しない(ダウンロード機能が必要な対象画面のみ)ことも試みましたが変化ありませんでした。 ”no-cache”以外になにか指定したほうがよいのでしょうか? あと、EXCELをダウンロードダイアログの出る前に既に起動している状態にすると”開く”で、目的のファイルがきっちり表示されるようです。これは何か関係あるのでしょうか? 色々記述し申し訳ありませんが、宜しくお願いします。
- taseki
- ベストアンサー率66% (155/233)
日本語ファイル名をASCII文字だけにしてみると、どうでしょう。 http://support.microsoft.com/default.aspx?scid=kb;ja;436616 あるいはCache-Controlが関係しているとか。 http://support.microsoft.com/?scid=kb;ja;436605&spid=2073&sid=269 ブラウザのキャッシュ(Temporary Internet Files)をクリアしてみると、どうでしょうか。
補足
早速ありがとう御座います。 >あるいはCache-Controlが関係しているとか 上記内容について確認しましたが、事象は変わりませんでした。(no-Cacheを使用しない。また、inlineを指定すると、ブラウザにCSVがEXCELイメージで表示されてしまうため、要件と異なります。ダウンロードした後、EXCELで開いたイメージにしたいとのことでした。) また、ファイル名を”pp.csv”等日本語を使用しないパターンにした場合、ダウンロードダイアログで表示されるダウンロード対象ファイル名が、ロジック記述しているソース名(ListOut_asp)となってしまいます。(もちろんダウンロードできません。) 最後にブラウザのキャッシュもクリアしてみましたが、特に変わりがありません。 他に心当たりありますでしょうか? 宜しくお願いします。
補足
>また、「もちろんダウンロードできません。」も、ち>ょっと考えにくいです。ファイル名 >が「ListOut_asp」になってしまったとしても、なぜ >ダウンロードできないのか、というより、ダウンロー>ドできないとは具体的にはどう言うことですか?エラ>ーが発生するということですか? 度々すみません。最初から順にお話いたします。 まず「ListOut_asp」のダウンロードですが、まず”保存”ボタンをクリックした場合は、次のMSGがでます。 『Internet Explorer では、ListOut.aspを開くことができません。 このインターネットのサイトを開くことができませんでした。要求されたサイトが使用できないか、見つけることができません。後でやり直してください。』 また、”開く”ボタンをクリックした場合は、次のエラーとなり処理は終了します。 『エラー タイプ ADODB.Stream (0x800A0BBA) ファイルを開けませんでした。』 まずこの内容の回答でよろしかったでしょうか? お手数ですが、宜しくお願い致します。