WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:PHPにてファイルの呼び出し

0:[投稿] KEN-KEN [2002/10/08 20:07 ][環境:WIN+IE PHP]

お世話になります。

現在、PHPにてあるファイルを呼び出してブラウザに表示するプログラム
を作成しています。
あるファイルとは以下のファイルです。
・MS Office系のファイル(Word、Excel、PowerPointなど)

ブラウザに表示するまでは問題なく出来たのですが、この表示された
ファイルを「名前を付けて保存」すると、保存するときの名前が
呼び出したプログラムの名前になってしまいます。
例えば、呼び出したプログラムがreadfile.phpでWordファイルを
呼び出したとするとreadfile.docというファイルで保存すること
になります。
ただ、該当ファイルの全てがそうなるわけではなく、PowerPointの
ファイルは、正しいファイル名で保存されるのですがその他のファイル
に関しては、全てプログラムの名前となってしまいます。
以下がプログラムのファイル呼び出し部分です。
PowerPointの場合
header( "Content-Length: $filesize" );
header( "Content-Disposition: filename=\"$file_name\"" );
header("Content-type: application/vnd.ms-powerpoint");

Wordの場合
header("Content-type: application/msword");
header("Content-Length: $filesize");
header("Content-Disposition: inline;filename=\"$file_name\"");

Excel、CSVファイルの場合
header("Content-type: application/vnd.ms-excel");
header("Content-Length: $filesize");
header("Content-Disposition: inline;filename=\"$file_name\"");

どなたか同じような問題を解決された方はいらっしゃいますでしょうか?
こちらは、IE5.5と6.0(いずれもパッチ適用済み)でテストを行いましたが
どちらでも同じ症状がでました。
検索してみると、MSのページにIE5.0である文字コードを含むファイル名が
正しく保存されないというようなバグ報告が載っていたのですが
その後のバージョンで修正されているようでした。
これもその類のものなのでしょうか。。。

環境
ReaHat Linux7.1J
PHP4.1.2
Apache1.3.26

よろしくお願いいたします。


1:[回答] 29歳からのPerl [2002/10/09 00:44 ]

文章の内容からして、外している可能性大なのですが、
あえて書かせてもらいますと。

phpで、officeの呼び出しは、
 header("Location: http://www.abc.ne.jp/office/readfile.doc");
 exit(0);

これで、呼び出し、保存をいつもイントラネットでやっているつもりなのです。
名前の部分は、[1]などがつく場合がありますけど(readfile[1].docになる)。

やっぱり、外してますか?

(我流の説明)
はっきりした事はしりませんが、IEはアドレスバーの名前がつくのではないでしょうか?
そのためreplaceさせるために、locationでフルパス(http://から)指定してました。


2:[回答] KEN-KEN [2002/10/09 09:41 ]

ご回答ありがとうございます。
仰る通り、この方法であればファイルを正しい名前で参照することは
可能なようです。
しかし、この場合URLを直に指定されてしまうとファイルが閲覧されてしまいます。
制限がかかったサイトで使用しているので、ファイルの保管場所
はユーザーに知らせたくないという理由があります。
(実際のファイルはApacheのDocumentRoot外においていますので
直接アクセスできないようにしています)

また、
header("Content-Disposition: inline;filename=\"$file_name\"");
のinlineの部分をattacmentと変更し、ダウンロードするように変更
した場合は、正しいファイル名($file_name)でダウンロードする
ことが可能のようです。


3:[回答] JTR [2002/10/09 10:33 ]

>inlineの部分をattacmentと変更し...。
で、解決したのですか?


4:[回答] KEN-KEN [2002/10/09 10:39 ]

解決していません。
attachmentに変更した場合、ファイルはダウンロードされることになります。
本来、やりたいことはブラウザに表示させ、それを正しい名前で
ユーザーに保存させることです。
回避策として、このような方法を今のところとっていますが。。。
正しく保存させる方法はありますでしょうか?


5:[回答] 29歳からのPerl [2002/10/10 22:05 ]

違うかなと思い話にからましてもらったのは理由があります。
それは、これに似た処理を毎日使用してもらってるからです。

私は、以下の方法で処理しております。
1)マスターデータはDocumentRoot外にあります。
※この理由は万が一にもマスターデータを変更されないためが一番です。
2)ユーザは入室時にidを入力します。(ipチェックあり)
3)アクセスして来た人に応じて、ユーザセッションを開き
4)ユーザid+セッションidを元にフォルダを作成し
5)そのフォルダにアクセス制限を施す(ユーザipで)
6)そのフォルダにマスターデータからファイルをコピー
7)そのファイルにlocationさせる
8)セッションクローズ(または、一定時間)後にフォルダごと削除

どのユーザが回覧板を見たか確認する処理なども入っています。

こんな処理は、どうでしょうか?
我流なので大丈夫かと思いつつ、自社用だからいい加減なのです。

KEN-KENさんの話と違ったら申し訳ありません。


6:[回答] KEN-KEN [2002/10/11 11:47 ]

ご回答ありがとうございます。
一時、回避策で仰られているような案でシステムを作り直そうかという
意見がありました。
同じように該当ファイルをコピーしてそれにアクセスさせるというものです。
この案を取りやめた理由は上記の4)、6)、8)において問題があったためです。
まず、4)に関してですがあシステムにログインできる人と同じ数のフォルダを
作成する必要があります。
(フォルダ作成に関してはあらかじめ作成しておこうという意見でした)
次に6)ですが、ファイルを閲覧時にバックグラウンドでコピー作業
が発生します。
ファイル操作のためパフォーマンスが気になりました。
最後に8)ですが、不要なファイルが多数存在してしまうため、どこかのタイミングで
削除する必要が出てきてしまいます。
また、この問題のすべてに共通することがServerがLinuxのため
ファイル数が極端に増加した場合(数万件にもなった場合ですが。。。)
パフォーマンスが落ちるということを聞いたことがあったので
敬遠しました。

こちらのシステムでは、ご意見の中にあるフォルダに関するアクセス権や
どのユーザーが回覧版を見たか確認する処理などの高度な機能は含まれて
いませんでしたが。。。

貴重なご意見ありがとうございました。
もう少し、どうにかならないかこちらでも調べてみたいと思います。


7:[回答] B-Cus [2002/10/11 12:53 ]

CGI であれば office.cgi/sample.doc という URL でアクセスしてもらって、
CGI プログラム側で環境変数 PATH_INFO を解析して権限チェックをし、
その後

   Content-type: application/msword\n\n

   ファイル内容

を出力してやれば、

> システムにログインできる人と同じ数のフォルダを作成する

を行う必要はなくなりますが、PHP で似たようなことはできませんか?


8:[回答] KEN-KEN [2002/10/11 19:14 ]

回答ありがとうございます。
上記の方法は、何かモジュールを組み込む必要はないのですか?
(Perlから(この方法はPerlのものなのでしょうか?)DBに接続するときに組み込むDBIやDBDみたいな)
詳しく調べてないのですが、現在のところ似たようなPHPプログラムを
独自に作成してアクセスさせています。
ファイルが格納されているパスを送り、それを元に呼び出すというような
方法です。
また、現在のところブラウザに表示するのは、全然問題なく表示されています。
今回、あえてブラウザから保存させる方法にこだわっているのは
ユーザーがファイルをブラウザで閲覧する件数とファイルをローカルに保存する
件数では前者の方が多いからです。
そのため、1アクションで終了するブラウザに表示させる方法を取ろうと考えています。
保存したい場合は、ブラウザの「名前を付けて保存」で行ってもらうという感じです。
ここで、該当ファイル名が正しく保存できないため、保存後ユーザーに
書き換えてもらわなければならないという手間が発生してしまいます。

CGIでこのようなアクセスの仕方があるのは知りませんでした。
貴重なご意見ありがとうございます。


9:[回答] ふじ [URL] [2002/10/11 22:40 ]

PHP なら getenv で環境変数が取得できるので、
あとは CGI と一緒です。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World