Package Data | |
---|---|
Maintainer Username: | jszobody |
Maintainer Contact: | joseph@stechstudio.com (Joseph Szobody) |
Package Create Date: | 2019-04-11 |
Package Last Update: | 2024-11-04 |
Home Page: | |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-11-15 15:20:15 |
Package Statistics | |
---|---|
Total Downloads: | 1,929,757 |
Monthly Downloads: | 78,986 |
Daily Downloads: | 3,415 |
Total Stars: | 417 |
Total Watchers: | 10 |
Total Forks: | 59 |
Total Open Issues: | 3 |
A fast and simple streaming zip file downloader for Laravel.
Content-Length
header. The user gets an accurate download time estimate in their browser.composer require stechstudio/laravel-zipstream
The service provider and facade will be automatically wired up.
create
method on the Zip
facadeuse Zip;
class ZipController {
public function build()
{
return Zip::create("package.zip", [
"/path/to/Some File.pdf",
"/path/to/Export.xlsx"
]);
}
}
That's it! A StreamedResponse
will be returned and the zip contents built and streamed out. The user's browser will begin downloading a package.zip
file immediately.
By default any files you add will be stored in the root of the zip, with their original filenames.
You can customize the filename and even create subfolders within the zip by providing your files array with key/value pairs:
Zip::create("package.zip", [
// Will be stored as `Some File.pdf` in the zip
"/path/to/Some File.pdf",
// Will be stored as `Export.xlsx` in the zip
"/path/to/data.xlsx" => 'Export.xlsx',
// Will create a `log` subfolder in the zip and be stored as `log/details.txt`
"/path/to/log.txt" => "log/details.txt"
]);
You can also provide your files one at a time:
Zip::create("package.zip")
->add("/path/to/Some File.pdf")
->add("/path/to/data.xlsx", 'Export.xlsx')
->add("/path/to/log.txt", "log/details.txt");
You can add HTTP URLs as the source filepath. Note that zip filesize can only be calculated up front if the HTTP source provides a Content-Length
header, not all URLs do.
Zip::create("package.zip")
->add("https://...", "myfile.pdf");
You can provide raw data instead of a filepath:
Zip::create("package.zip")
->addRaw("...file contents...", "hello.txt");
You can stream files from S3 into your zip.
Install the aws/aws-sdk-php
package
Setup an AWS IAM user with s3:GetObject
permission for the S3 bucket and objects you intend to zip up.
Store your credentials as AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
, and AWS_DEFAULT_REGION
in your .env file.
Provide s3://
paths when creating the zip:
Zip::create("package.zip")
->add("s3://bucket-name/path/to/object.pdf", "Something.pdf");
If you need to pull files from an S3 region other than what you have specified in AWS_DEFAULT_REGION
you can make the File
instance yourself and then set the region name.
use Zip;
use STS\ZipStream\Models\File;
Zip::create("package.zip")
->add(File::make("s3://bucket-name/path/to/object.pdf", "Something.pdf")->setRegion("us-west-2"));
By default this package attempts to predict the final zip size and sends a Content-Length
header up front. This means users will see accurate progress on their download, even though the zip is being streamed out as it is created!
This only works if files are not compressed.
If you have issues with the zip size prediction you can disable it with ZIPSTREAM_PREDICT_SIZE=false
in your .env file.
By default this package uses no compression. Why?
If you want to compress your zip files set ZIPSTREAM_FILE_METHOD=deflate
in your .env file. Just realize this will disable the Content-Length
header.
Even though the primary goal of this package is to enable zip downloads without saving to disk, there may be times you'd like to generate a zip on disk as well. And you might as well make use of this package to do so.
Use the saveTo
method to write the entire zip to disk immediately. Note that this expects a folder path, the zip name will be appended.
Zip::create("package.zip")
// ... add files ...
->saveTo("/path/to/folder");
And yes, if you've properly setup and configured S3 you can even save to an S3 bucket/path.
Zip::create("package.zip")
// ... add files ...
->saveTo("s3://bucket-name/path/to/folder");
What if you have a lot of users requesting the same zip payload? It might be nice to stream out the zip while also caching it to disk for the future.
Use the cache
method to provide a cache path. Note this should be the entire path including filename.
Zip::create("package.zip")
// ... add files ...
->cache("/path/to/folder/some-unique-cache-name.zip");
You might use an internal DB id for your cache name, so that the next time a user requests a zip download you can determine if one is already built and just hand it back.
STS\ZipStream\Events\ZipStreaming
: Dispatched when a new zip stream begins processingSTS\ZipStream\Events\ZipStreamed
: Dispatched when a zip finishes streamingSTS\ZipStream\Events\ZipSizePredictionFailed
: Fired if the predicted filesize doesn't match the final size. If you have filesize prediction enabled it's a good idea to listen for this event and log it, since that might mean the zip download failed or was corrupt for your user.The MIT License (MIT). Please see License File for more information.