How to archive pdf files into zip file?

Hi master,
I want to ask.
I have a file field that contains upload multiple pdf files as many as 5 files.
I added a custom field to download the five pdf files into a zip file.
with the following code:

function Row_Rendered()
{
    // To view properties of field class, use:
    //var_dump($this-><FieldName>);
    $this->dowload_all->ViewValue = "<i class='fa fa-file-text'></i>";

    $error = ""; //error holder
    if (isset($_POST["createpdf"])) {
        $post = $_POST;
        $file_folder = "files/" . $this->file->CurrentValue; // folder to load files
        if (extension_loaded("zip")) {
            // Checking ZIP extension is available
            if (isset($post["file"]) and count($post["file"]) > 0) {
                // Checking files are selected
                $zip = new ZipArchive(); // Load zip library
                $zip_name = time() . ".zip"; // Zip name
                if ($zip->open($zip_name, ZIPARCHIVE::CREATE) !== true) {
                    // Opening zip file to load files
                    $error .= "* Sorry ZIP creation failed at this time";
                }
                foreach ($post["file"] as $file) {
                    $zip->addFile($file_folder . $file); // Adding files into zip
                }
                $zip->close();
                if (file_exists($zip_name)) {
                    // push to download the zip
                    header("Content-type: application/zip");
                    header(
                        'Content-Disposition: attachment; filename="' .
                            $zip_name .
                            '"'
                    );
                    readfile($zip_name);
                    // remove zip file is exists in temp path
                    unlink($zip_name);
                }
            } else {
                $error .= "* Please select file to zip ";
            }
        } else {
            $error .= "* You dont have ZIP extension";
        }
    }
}

my code has no errors and doesn’t work, can anyone help me with the solution, or am I putting the code in the wrong place?

Row_Rendered is a server event for the List or View pages, I assume you meant you want to alllow users to download the files previously uploaded in Add or Edit pages.

lissa wrote:

$post = $_POST;
if (isset($post["file"]) and count($post["file"]) > 0) {

The files are already uploaded and saved in the upload path of your field. There is no files in $_POST, you should find your files in the field’s upload folder.

Yes, right,
I want the 5 files that have been uploaded to be downloaded by the user in the form of a zip file. can you give advice?

sorry, what I meant was that the file I previously uploaded was a pdf file, when the user wants to download the five pdf files it automatically becomes a zip file

The case remains the same regardless of uploaded file types. arbei wrote:

you should find your files in the field’s upload folder.

Hi, I have activated ZipArchive but an error appears Class “PHPMaker2024\app_arsip\ZipArchive” not found in the attached image.
can you help me

You should use fully qualified name, read Using namespaces: Basics.

Thank you, it worked.

I have 1 field type varchar to upload multiple pdf files, and I tried an array like this, it successfully formed a zip file.

$list_file_pdf = array("files/archive/document1.pdf",
"files/archive/document2.pdf","files/archive/document3.pdf");

I tried changing the code above to be like this but it didn’t work

$list_file_pdf = array($this->FILE->CurrentValue);

Is there a solution to my problem?

ErrorException (E_WARNING)
ZipArchive::addFile(): No such file or directory

$this->FILE->CurrentValue is only the file name, you need to provide the path also.

I have changed and given the path too

$daftar_file_pdf = array("files/arsip/". $this->FILE->CurrentValue);

but still get the same error

This file field has a varchar value and the text value is “document1.pdf,document2.pdf,document3.pdf”
file upload multiple

Then your code will output array("files/arsip/document1.pdf,document2.pdf,document3.pdf"). You need to modify your code to add path for each file and return as an array.

the code has successfully archived the zip file, but when you press the save button after executing the zip archive the mouse changes to a bussy icon like the image I attached.
I tried it in the updated row, here is my code:

$list_file_pdf = explode(",", $this->FILE->CurrentValue);
$name_zip = 'files/arsip/arsip_pdf_' . date('YmdHis') . '.zip';
$zip = new ZipArchive();
if ($zip->open($name_zip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== FALSE) {
foreach ($list_file_pdf as $file_pdf) {
$zip->addFile("files/arsip/".$file_pdf);
}
$zip->close();
header("Content-Disposition: attachment; filename=" . $name_zip);
header("Content-Type: application/zip");
 readfile($name_zip);
 unlink($name_zip);
 } else {
 echo "Failed to create ZIP file.";
 }

You may want to explain how you trigger your code. You may want to post your complete code. What are you trying to achieve? In which page? Why is there a “Save” button? In your first post you said “added a custom field to download the pdf files into a zip file”? In addition, your code outputs the zip file immediately, it may break the original flow of your page.

hi i try different case again to zip file, so i have 3 fields (FILE1, FILE2, FILE3)
i put all three fields in array, like this :

$list_file_pdf = array($this->FILE1->CurrentValue, $this->FILE2->CurrentValue, $this->FILE3->CurrentValue);

what if one of the fields is empty array automatically does not enter its value, only files that have value will be archived zip by array.
i try code like this too complicated and lots of code

if (empty($this->FILE1->DbValue)) {
        $list_file_pdf = array($this->FILE2->CurrentValue, $this->FILE3->CurrentValue);
} elseif (empty($this->FILE2->DbValue)){
        $list_file_pdf = array($this->FILE1->CurrentValue, $this->FILE3->CurrentValue);
} elseif (empty($this->FILE3->DbValue)){
        $list_file_pdf = array($this->FILE1->CurrentValue, $this->FILE2->CurrentValue);
}  else {
        $list_file_pdf = array($this->FILE1->CurrentValue, $this->FILE2->CurrentValue, $this->FILE3->CurrentValue);
}

is there any solution?