當前位置: 首頁> 最新文章列表> 如何用file_get_contents 讀取ZIP 等壓縮文件內容?可行性與方法解析

如何用file_get_contents 讀取ZIP 等壓縮文件內容?可行性與方法解析

gitbox 2025-08-11

file_get_contents()的工作原理

file_get_contents()是一個簡便的文件讀取函數,它的基本功能是讀取整個文件的內容並將其返回。通常用於讀取文本文件,對於小型的二進製文件也非常適用。但對於大型文件或壓縮文件,這個函數的效率和適用性可能會受到限制。

在PHP 中, file_get_contents()會將文件直接加載到內存中。因此,當文件較大時,內存的使用量會很高,可能導致內存溢出。對於壓縮文件, file_get_contents()僅僅是讀取其二進制數據,並不能直接解壓或讀取其中的內容。


直接讀取ZIP 文件的挑戰

ZIP 文件本質上是一個二進制格式的壓縮文件,裡麵包含了多個文件或者目錄。 file_get_contents()讀取的是整個壓縮文件的原始二進制數據,這意味著如果我們直接讀取一個ZIP 文件,會得到的是一個壓縮後的二進制流,而不是其解壓後的內容。

因此,如果我們想要從ZIP 文件中提取某個文件的內容, file_get_contents()並不能直接完成這一任務。為了能夠讀取其中的文件,我們需要解壓ZIP 文件內容。


解決方案:使用PHP 的ZIP 擴展

雖然file_get_contents()本身不能直接讀取ZIP 文件中的具體內容,但我們可以利用PHP 內置的ZipArchive類來操作ZIP 文件。這個類允許我們打開、讀取和解壓ZIP 文件。以下是一個使用ZipArchive來讀取ZIP 文件內容的例子。

示例代碼:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$zipFile</span></span><span> = </span><span><span class="hljs-string">'example.zip'</span></span><span>;  </span><span><span class="hljs-comment">// ZIP 文件的路徑</span></span><span>
</span><span><span class="hljs-variable">$zip</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">ZipArchive</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">open</span></span><span>(</span><span><span class="hljs-variable">$zipFile</span></span><span>) === </span><span><span class="hljs-literal">TRUE</span></span><span>) {
    </span><span><span class="hljs-comment">// 獲取 ZIP 文件中的第一個文件名</span></span><span>
    </span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getNameIndex</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);  </span><span><span class="hljs-comment">// 獲取第一个文件的名称</span></span><span>

    </span><span><span class="hljs-comment">// 讀取該文件的內容</span></span><span>
    </span><span><span class="hljs-variable">$fileContent</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getFromName</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);

    </span><span><span class="hljs-comment">// 輸出文件內容</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$fileContent</span></span><span>;

    </span><span><span class="hljs-comment">// 關閉 ZIP 文件</span></span><span>
    </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'無法打開 ZIP 文件!'</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在這個例子中,我們首先使用ZipArchive類打開ZIP 文件,然後使用getFromName()方法讀取ZIP 文件中第一個文件的內容。通過這種方式,我們可以方便地提取出壓縮包中的文件,而不是直接讀取整個壓縮文件的二進制數據。


使用file_get_contents()配合ZipArchive

雖然file_get_contents()本身無法解壓ZIP 文件,但我們仍然可以將file_get_contents()用來讀取ZIP 文件的原始二進制內容,然後將其傳遞給ZipArchive類進行解壓。這樣, file_get_contents()就成為了讀取文件的一個前置步驟,而實際的解壓操作由ZipArchive完成。

示例代碼:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$zipFile</span></span><span> = </span><span><span class="hljs-string">'example.zip'</span></span><span>;  </span><span><span class="hljs-comment">// ZIP 文件的路徑</span></span><span>

</span><span><span class="hljs-comment">// 讀取 ZIP 文件的原始內容</span></span><span>
</span><span><span class="hljs-variable">$zipData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$zipFile</span></span><span>);

</span><span><span class="hljs-comment">// 将讀取到的二进制数据传递给 ZipArchive 解壓</span></span><span>
</span><span><span class="hljs-variable">$zip</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">ZipArchive</span></span><span>;
</span><span><span class="hljs-variable">$tmpFile</span></span><span> = </span><span><span class="hljs-title function_ invoke__">tempnam</span></span><span>(</span><span><span class="hljs-title function_ invoke__">sys_get_temp_dir</span></span><span>(), </span><span><span class="hljs-string">'zip'</span></span><span>);  </span><span><span class="hljs-comment">// 創建一個臨時文件</span></span><span>

</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</span></span><span>, </span><span><span class="hljs-variable">$zipData</span></span><span>);  </span><span><span class="hljs-comment">// 将讀取的二进制数据写入临时文件</span></span><span>

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">open</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</span></span><span>) === </span><span><span class="hljs-literal">TRUE</span></span><span>) {
    </span><span><span class="hljs-comment">// 獲取 ZIP 文件中的第一個文件名</span></span><span>
    </span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getNameIndex</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);  </span><span><span class="hljs-comment">// 獲取第一个文件的名称</span></span><span>

    </span><span><span class="hljs-comment">// 讀取該文件的內容</span></span><span>
    </span><span><span class="hljs-variable">$fileContent</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getFromName</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);

    </span><span><span class="hljs-comment">// 輸出文件內容</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$fileContent</span></span><span>;

    </span><span><span class="hljs-comment">// 關閉 ZIP 文件</span></span><span>
    </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();

    </span><span><span class="hljs-comment">// 刪除臨時文件</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'無法打開 ZIP 文件!'</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在這個例子中,我們首先通過file_get_contents()讀取ZIP 文件的二進制數據,然後將數據寫入一個臨時文件。接著,我們使用ZipArchive類打開這個臨時文件,讀取其中的內容。這樣, file_get_contents()就成為了讀取原始數據的工具,解壓縮的操作依然交給ZipArchive完成。