当方VBscriptで開発しているものです。
検索して同一の質問がなかったようなのでご教授お願いいたします。
SQLServer上にImage型のカラムを持つテーブルを作成し、
エクセルファイル、PDFファイル、PPTファイル等のデータをバイナリで
格納しております。
select * from T_Sample where CONTAINS(FileContents,'hogehoge')"
等でヒットしたファイルを直接ブラウザに表示する方法に躓いております。
クライアントにダウンロードさせる形ではなくブラウザに直接表示
するのみにとどめたいと思っております。
よろしくお願いいたします。
ブラウザに表示…ですか。
それは、WSHからIEを起動して、そこに表示させるような処理でしょうか。
それともASPのサーバ側スクリプトにて、クライアント側にHTTP応答で
画像を返すような処理なのでしょうか。
もしも後者だとしたら、たとえば
<img src="hoge.asp?FileContents=hogehoge"
width="128" height="128" alt="hoge画像">
のようなHTMLから hoge.aspが呼ばれるようにしておき、
この hoge.asp 中で、画像を Response.BinaryWrite しては如何でしょう。
早速のお返事ありがとうございます。
おそらくは後者だと思われます(わかりにくくてすみません)
Response.BinaryWriteで直接バイナリデータをかくのでよろしいのでしょうか?
たとえば
byData = rs.Fields("FileContents").Value
のようにカラムの値を変数に格納し、 Response.BinaryWrite(wk_cate_title)
と直接書き出す方法で良いのでしょうか?
ちなみにFileContents=hogehogeのhogehogeの部分は
それぞれエクセル、パワーポイント等のファイルによって異なるのでしょうか?
たびたびの質問すみません。よろしくお願いいたします。
> Response.BinaryWriteで直接バイナリデータをかくのでよろしいのでしょうか?
それで OK ですが、Response.BinaryWrite の引数には、
「バイト配列」のみが指定可能である点には注意してください。
TypeName(〜〜) が "Byte()" を返すようなデータならば良いですが、
"String" などを返す場合には、Response.BinaryWrite は使えません。
> ちなみにFileContents=hogehogeのhogehogeの部分は
あ。その部分には何の意味もありません。m(_ _)m
もし、hoge.asp 側に、何らかのパラメータを渡す必要があったなら、
Request.QueryString()を使うのが楽かな、と思っただけです。
QueryStringを渡す必要が無ければ、<img src="hoge.asp" 〜> でも良いでしょうし。
ありがとうございます。
やはりResponse.BinaryWrite()を使ってデータを表示すると
エクセルファイルが立ち上がりますが、文字が全て化けてしまっており、
中のデータがまずくなっているようです。
検索し、期待通りの値が帰ってくるのでデータを格納する事事態には
問題がないと思っています。
rs.Open "select * from T_Sample where CONTAINS(FileContents,'検索文字')", db_is, adOpenForwardOnly, adLockReadOnly
これで検索し、返ってきた値をbyData = rs.Fields("FileContents").Value
とし、Response.BinaryWrite(byData )としても文字化けが発生します。
ためしに
Response.ContentType="application/ms-excel"
と指定して、エクセルファイルの抽出を行ってみたのですが結果は
かわりませんでした。。
エクセルファイルだからまずいのかと思い、画像ファイルも一度
テーブルにアップロードした後に表示すると、画像ではなくて
文字列の化けたものがブラウザ上に表示されます。。
データにアップロードするのがまずいんだろうか…。
もうちょっと調べてみます…。
しまった。質問の内容をきちんと読んでいませんでした…。
Image型に格納してあるのは画像ではなく、Office文書でしたね。
> クライアントにダウンロードさせる形ではなくブラウザに直接表示
> するのみにとどめたいと思っております。
ActiveX ドキュメントとして、ブラウザで直接表示されるか、
それともダウンロードになるかは、クライアント側の設定に
依存してしまうのでは。
http://support.microsoft.com/default.aspx?scid=kb;ja;162059
> byData = rs.Fields("FileContents").Value
ファイルサイズによっては、GetChunk メソッドを使って、
分割して取得した方が良いかも。(今回の件とは関係ありませんが)
> Response.ContentType="application/ms-excel"
"application/vnd.ms-excel" だとどうでしょう?
> とし、Response.BinaryWrite(byData )としても文字化けが発生します。
もしも元のファイルがあるなら、
http://support.microsoft.com/default.aspx?scid=kb;JA;260519
の手順でダウンロードさせてみて、バイナリの内容を
バイナリエディタ等で比較してみては如何でしょう。
お返事ありがとうございます。
早速
Response.ContentType = "application/vnd.ms-excel"
の指定で行ってみましたが、文字化けは直らないようです。
ちなみに
http://support.microsoft.com/default.aspx?scid=kb;ja;162059
こちらの設定で別画面にエクセルドキュメントとして表示されるように
ためしに自分のマシンでやってみました。(文字化けの直接の
原因ではないと思いますが)
バイナリエディタで確認してみたほうがよさそうですね…。
それで違えば格納時がまずいと推定できそうですし…。
やってみます。
ありがとうございました!
一応、自己レスです(解決していませんが)
DBにアップロードしたファイルと、ダウンロード後のファイルを
バイナリでみてみると微妙に違っているようです。
(ダウンロードは文字化けしているエクセルのファイルをそのまま
デスクトップに保存してみました…)
もしかしたらアップロード時の処理でなにか抜けているものが
あるのかもしれません。
解決いたしました。
魔界の仮面弁士様、ありがとうございました。
原因は、…恥ずかしながらファイル出力用のプログラムを
前画面のものからコピーしたため、HTMLのタグが入っていたことが
原因のようです ○|‾|_
バイナリエディタで双方を見比べてみたところ、ダウンロードした
ファイルの方にHTMLタグらしきものがあり、もしかしてこれでは?
と思ってプログラムにあったタグを全て削除してみたところ…。
表示されました…。画像、エクセルファイル供にです。
情けないやら。Response.BinaryWriteでそのまま出力すれば
きちんと表示されました。
ありがとうございました。
ツイート | ![]() |