简体   繁体   中英

create and download zip file using php

i am trying to create a zip file(using php) for this i have written the following code:

$fileName = "1.docx,2.docx";
$fileNames = explode(',', $fileName);
$zipName = 'download_resume.zip';
$resumePath = asset_url() . "uploads/resume/";
//http://localhost/mywebsite/public/uploads/resume/

$zip = new ZipArchive();
if ($zip->open($zipName, ZIPARCHIVE::CREATE) !== TRUE) {
    echo json_encode("Cannot Open");
}

foreach ($fileNames as $files) {
    $zip->addFile($resumePath . $files, $files);
}
$zip->close();
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zipName."");
header("Content-length: " . filesize($zipName));
header("Pragma: no-cache"); 
header("Expires: 0");
readfile($zipName);
exit;

however on a button click i am not getting anything..not even any error or message..

any help or suggestion would be a great help for me.. thanks in advance

Why not use the Zip Encoding Class in Codeigniter - it will do this for you

$name = 'mydata1.txt';
$data = 'A Data String!';

$this->zip->add_data($name, $data);

// Write the zip file to a folder on your server. Name it "my_backup.zip"
$this->zip->archive('/path/to/directory/my_backup.zip'); 

// Download the file to your desktop. Name it "my_backup.zip"
$this->zip->download('my_backup.zip');

https://www.codeigniter.com/user_guide/libraries/zip.html

  1. What is asset_url() function? Try to use APPPATH constant istead this function:

     $resumePath = APPPATH."../uploads/resume/";  
  2. Add "exists" validation for file names:

     foreach ($fileNames as $files) { \n    if (is_file($resumePath . $files)) { \n        $zip->addFile($resumePath . $files, $files); \n    } \n}  
  3. Add exit() after:

     echo json_encode("Cannot Open");  

Also I think it's the better desision to use CI zip library User Guide . Simple example:

public function generate_zip($files = array(), $path)
{
    if (empty($files)) {
        throw new Exception('Archive should\'t be empty');
    }
    $this->load->library('zip');
    foreach ($files as $file) {
        $this->zip->read_file($file);
    }
    $this->zip->archive($path);
}

public function download_zip($path)
{
    if (!file_exists($path)) {
        throw new Exception('Archive doesn\'t exists');
    }
    $this->load->library('zip');
    $this->zip->download($path);
}

... it work for me

public function downloadall(){

        $createdzipname = 'myzipfilename';

        $this->load->library('zip');
        $this->load->helper('download');
        $cours_id = $this->input->post('todownloadall');
        $files = $this->model_travaux->getByID($cours_id); 

        // create new folder 
        $this->zip->add_dir('zipfolder');

        foreach ($files as $file) {
            $paths = 'http://localhost/uploads/'.$file->file_name.'.docx';
            // add data own data into the folder created
            $this->zip->add_data('zipfolder/'.$paths,file_get_contents($paths));    
        }
        $this->zip->download($createdzipname.'.zip');
    }

Below scripting working ok in my local system. 1st remove asset_url() from $resumePath and set zip file store location relative path. - Pass zip file name with its location path to $zip->open()

$fileName = "1.docx,2.docx";
$fileNames = explode(',', $fileName);
$zipName   = 'download_resume.zip';
$resumePath = "resume/";

$zip = new ZipArchive();
if ($zip->open($resumePath.$zipName, ZIPARCHIVE::CREATE) !== TRUE) {
 echo json_encode("Cannot Open");
}

foreach ($fileNames as $files) {
 $zip->addFile($files, $files);
}
$zip->close();

/* create zip folder */

public function zip(){
    $getImage = $this->cart_model->getImage();
    $zip = new ZipArchive;
    $auto = rand();
    $file = date("dmYhis",strtotime("Y:m:d H:i:s")).$auto.'.zip';
    if ($zip->open('./download/'.$file,  ZipArchive::CREATE)) {
        foreach($getImage as $getImages){
            $zip->addFile('./assets/upload/photos/'.$getImages->image, $getImages->image);
        }
        $zip->close();
        $downloadFile = $file;
        $download = Header("Location:http://localhost/projectname/download/".$downloadFile);


    }
}

model------

/* get add to cart image */

public function getImage(){
    $user_id = $this->session->userdata('user_id');
    $this->db->select('tbl_cart.photo_id, tbl_album_image.image as image');
    $this->db->from('tbl_cart');
    $this->db->join('tbl_album_image', 'tbl_album_image.id = tbl_cart.photo_id', 'LEFT');
    $this->db->where('user_id', $user_id);
    return $this->db->get()->result();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM