创建多个文件的 zip 并在 Laravel 中下载

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/51873115/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 17:58:45  来源:igfitidea点击:

Creating zip of multiple files and download in laravel

laravel

提问by Udipta Gogoi

i am using the following codes to make zip and allow user to download the zip

我正在使用以下代码制作 zip 并允许用户下载 zip

but its not working.it shows the error as ZipArchive::close(): Read error: Bad file descriptor.What might be the problem?i am working with laravel.

但它不工作。它将错误显示为 ZipArchive::close(): Read error: Bad file descriptor。可能是什么问题?我正在使用 laravel。

public function downloadposts(int $id)
{
    $post = Post::find($id);


    // Define Dir Folder
    $public_dir = public_path() . DIRECTORY_SEPARATOR . 'uploads/post/zip';
    $file_path = public_path() . DIRECTORY_SEPARATOR . 'uploads/post';
    // Zip File Name
    $zipFileName = $post->post_title . '.zip';
    // Create ZipArchive Obj
    $zip = new ZipArchive();
    if ($zip->open($public_dir . DIRECTORY_SEPARATOR . $zipFileName, ZipArchive::CREATE) === TRUE) {
        // Add File in ZipArchive
        foreach ($post->PostDetails as $postdetails) {
            $zip->addFile($file_path, $postdetails->file_name);
        }
        // Close ZipArchive
        $zip->close();
    }
    // Set Header
    $headers = [
        'Content-Type' => 'application/octet-stream',
    ];
    $filetopath = $public_dir . '/' . $zipFileName;
    dd($filetopath);
    // Create Download Response
    if (file_exists($filetopath)) {
        return response()->download($filetopath, $zipFileName, $headers);
    }

    return redirect()->back();
}

回答by Prashant Prajapati

I will suggest you to use Zipperpackage

我会建议你使用拉链

Try below code for creating zip of multiple files :

尝试以下代码来创建多个文件的 zip:

public function downloadZip($id)
    {
        $headers = ["Content-Type"=>"application/zip"];
        $fileName = $id.".zip"; // name of zip
        Zipper::make(public_path('/documents/'.$id.'.zip')) //file path for zip file
                ->add(public_path()."/documents/".$id.'/')->close(); //files to be zipped

        return response()
        ->download(public_path('/documents/'.$fileName),$fileName, $headers);
    }

回答by William Desportes

Only pure php code.

只有纯php代码。

public function makeZipWithFiles(string $zipPathAndName, array $filesAndPaths): void
{
    $zip = new ZipArchive();
    $tempFile = tmpfile();
    $tempFileUri = stream_get_meta_data($tempFile)['uri'];
    if ($zip->open($tempFileUri, ZipArchive::CREATE) === TRUE) {
        // Add File in ZipArchive
        foreach($filesAndPaths as $file)
        {
            if (! $zip->addFile($file, basename($file))) {
                echo 'Could not add file to ZIP: ' . $file;
            }
        }
        // Close ZipArchive
        $zip->close();
    } else {
        echo 'Could not open ZIP file.';
    }
    echo 'Path:' . $zipPathAndName;
    rename($tempFileUri, $zipPathAndName);
}