• ベストアンサー

PEAR PHP メール添付画像のオリジナル名

下記のサイトに掲載されていますスクリプトを試しております。 http://www.phppro.jp/phptips/archives/vol35/1 //添付内容をファイルに保存 の部分で添付ファイルを別名で保存しているようですが、これを元の オリジナル名で保存したいのですが、オリジナル名はどうやって取得 すればよいのでしょうか? またファイル名が日本語の場合も同じように取得できるのでしょうか? お詳しい方、どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

content-typeにfilenameがあれば取得はできると思います。 (e.g.) list($dmy, $org_name) = explode('filename=', $part->headers['content-disposition']); print $org_name; 二重引用符で括られているかもしれませんので(というか、ほとんどの場合括られているでしょうね)、その点だけ注意すればいいかと思います。 ただし「オリジナル名で保存」というのは危険すぎます。ファイルシステムで使えない文字が混入していたらどうするのでしょうか。特に日本語のファイル名は「文字エンコーディング」次第では削除出来ないファイルを作る怖れがあります。 元のファイル名と保存したファイルの関連付けの仕組みを別途考えるべきです。管理用のファイル(保存したファイル名と元ファイル名のペアのテキストファイルでいいですね)を作成するとか、いっそまとめて(バイナリデータも)データベースに入れるなど、いくらでも手法はあると思います。

kent_long
質問者

お礼

お礼が遅くなりまして申し訳ありません。 メールの生ログを取得して、いろいろと実験をしてみました。 その結果、オリジナルのファイル名を取得する事ができたのですが、 仰るとおり、確かにそのまま扱うのは危険ですね。 UNIXタイムスタンプなどを組み合わせた、法則性のあるファイル名に 書き換えて保存するよう対策をしたいと思います。 貴重なご意見、ありがとうございました。

その他の回答 (1)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

ANo.1です。すみません。content-typeに・・と書きながら、例示したのはcontent-dispositionから取得してますね。 実際には、$part->headers['content-type']と$part->headers['content-disposition']の両方に「ファイル名」が存在するのが普通です。∴ 前者(content-type)で取得出来なければ後者(content-disosition)を試すといった感じでいいと思います。 Content-Type: image/jpeg; name="xxxx.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xxxx.jpg" なお「日本語」の場合は(当然ですが)デコードされた結果がJIS(ISO-2022-JP)で入ると思いますので、適宜mb_convert_encodingで変換してください。