maennchen / maennchen/ZipStream-PHP

Add file to existing archive

Open
#262 5 comments 0 reactions 0 assignees View on GitHub
enhancement help wanted
Dominant language
PHP
Stars
1.9k
Forks
112
Avg merge
14m
Merged PRs (30d)
4

Description

### Description

### Discussed in https://github.com/maennchen/ZipStream-PHP/discussions/261

Originally posted by **jhammer** May 19, 2023
Hi. Love ZipStream. We have a use case where we’d like to read a ZIP archive that is already on disk and stream it out to the user, but add file(s) to the stream as it goes out. The original ZIP archive on disk should remain untouched. We do not need to read or modify any of the files that are already in the stream.

The `ZipStream` constructor could be modified to take an optional `inputPath` or `inputStream` parameter. No other public API changes would be necessary.

We would be happy to sponsor development of this feature if you think it is feasible.

posted by **maennchen** May 19, 2023
Hmm. I think it should be possible.

I think appending files is a lot easier since the existing file headers do not have to be recomputed.

To do so, we‘d have to be able to parse header entries and skip existing files in the inputStream. As soon as we reach the central directory header, we‘d have to parse it, record its contents, write our own files and then emmit a new merged end on central directory record.

Another possibility to an inputStream would be a addFilesFromZip[Stream|Path] function. That would allow adding multiple zip contents.

The thing I‘m most worried about with this feature is that we‘d potentially read zip files which are using extensions / functionalities that this library does not support that might cause problems. We‘d probably have to be quite strict in what we parse initially.

One more option would be to use PHPs internal ZipArchive class and just loop its contents. But I don’t think that is what you were looking for.

I‘ll convert this to an issue to discuss the details of a possible implementation.

Contributor guide

Open the contributing guide

Research direction

Start by reviewing the ZipStream constructor and the existing archive output flow, then study how ZIP file headers and the central directory are handled. Compare the proposed inputStream, inputPath, and addFilesFromZip approaches, including supported ZIP extensions. Done means streaming an existing archive with additional files while leaving the original archive untouched.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
backend
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.