2012-02-12 33 views
0

私はリモートのZIPファイルを持っています。私たちのサーバーにzipファイルをコピーすることなく、zipファイルにあるファイルの内容を読む必要があります。これを解決するための解決策があるはずですが、私はそれを見つけることができません。PHP - サーバーに保存せずにzipファイルの内容を読み取る

例:
URL - http://example.com/feed.zip
ファイルZIPでアーカイブfeed.xml

である私はfeed.xmlの内容を読み、一つの変数に保存する必要があります。それでおしまい。

私は$z = new ZipArchive();と試してみましたが、オープンはリモートファイルではなくサーバーからファイルを読み取ることができます。

+3

なぜそれをサーバーにコピーしてからそれを削除してください?それは同じ量のトラフィックです... –

答えて

0

これは、の一時ファイルという概念を必要とします。技術的に言えば:はい、ZipArchiveがリモートのzipファイルでまったく動作しないため、ローカルで利用可能なリモートzipファイルの一時コピーを作成します。

一時コピーを実装するためにこれらのステップはあなたを助けるべき次のとおりです。

  1. 一時フォルダにリモートzipファイルのコピーを作成します。
  2. ZipArchiveを使用して、zipファイルのローカルコピーを解析します。
  3. feed.xmlファイルの情報を読み込みます。
  4. zipファイルのローカルコピーをすべて閉じて削除します。それは固定文字列ではない場合、URLは(にescapeshellarg)をエスケープする必要があることを

    $feed = `wget http://example.com/feed.zip -qO- | unzip - -p feed.xml`; 
    

    注:

+0

はい、私はこれがこのように動作することを知っていますが、それは最良の方法ではありません。それは、私のファイルが同じディレクトリ構造などを実行しているすべてのサーバ上に置く必要があることを意味します。私が考える最良の方法ではありません。他のオプションはありますか? –

+1

@Niko - サーバ上のzipファイルと同じディレクトリ構造は必要ありません。zipファイルからファイルを直接処理し、解凍してファイルを処理しません。 –

3

Aスーパー怠惰な解決策は次のようになります。

しかし、内蔵のZipArchive以外のZIPクラスも調べることができます。 PEARまたはPclZipは、回避策なしでストリームからの読み取りを許可する可能性があります。 (ただし、一時ファイルを避けたい場合は、php://メモリや文字列ストリームのラッパーも可能です)

+0

Mario、 'php:// temp'はどうですか?私がこれを使用する際に遭遇した唯一の問題は、ファイルポインタが閉じられるとファイルが消えてしまうことです。私の考えは、tempへの書き込み、ファイルの巻き戻し、ZipArchiveへのファイルポインタの受け渡し(何とか?) – Christian

関連する問題