download an existing file using codeigniter

Yasitha picture Yasitha · Mar 6, 2014 · Viewed 10.3k times · Source

I'm trying to make a website that can download jpg,png,pdf,docx file those are uploaded by an admin.

uploading those content is working without problem. when uploading i insert that file name in to mysql table as well. using that table I'am showing the uploaded file names to users.

this is the code I'am using for display those files.

<?php
            if (!empty($downloads)) {
                foreach ($downloads as $val) {
                    ?>            <div class="col-md-3 col-sm-6 col-xs-12">
                        <div class="panel panel-danger">
                            <div class="panel-heading panel-title">
                                <?php echo $val['upload_description']; ?>
                            </div>
                            <div class="panel-body">
                                <?php echo $val['file_name']; ?>
                                <div class="clear-fix clear clearfix"></div>
                                <div id="download" onclick="downloadFile('<?php echo $val['file_name']; ?>');" class="btn btn-danger">Download</div>
                            </div>
                        </div>
                    </div>
                    <?php
                }
            }
            ?>

and this is my ajax code

function downloadFile(str) {
                        //alert(str);
                        $.ajax({
                            type: 'POST',
                            url: 'downloadfiles',
                            data: {value: str},
                            success: function(data) {
                                alert('ok' + data);
                            }
                        });
                    }

when some one click on the download button, using ajax and jquery I'am sending that file name to a download_controller. this is the function in the download_controller file

public function download_files() {
    $fileName = $this->input->post('value');
    $file_path = 'uploaded/' . $fileName;
    $this->_push_file($file_path, $fileName);
 }

function _push_file($path, $name) {
        $this->load->helper('download');
        // make sure it's a file before doing anything!
        if (is_file($path)) {
            // required for IE
            if (ini_get('zlib.output_compression')) {
                ini_set('zlib.output_compression', 'Off');
            }

            // get the file mime type using the file extension
            $this->load->helper('file');
            $mime = get_mime_by_extension($path);
            // Build the headers to push out the file properly.
            header('Pragma: public');     // required
            header('Expires: 0');         // no cache
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
            header('Cache-Control: private', false);
            header('Content-Type: ' . $mime);  // Add the mime type from Code igniter.
            header('Content-Disposition: attachment; filename="' . basename($name) . '"');  // Add the file name
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . filesize($path)); // provide file size
            header('Connection: close');
            readfile($path); // push it out
            exit();
        }
    }

but the downloading never starting. when trying to download a png file i'm getting this kind of message.

enter image description here

can some one tell me what is the wrong thing I'am doing here?

thank You

Answer

Yasitha picture Yasitha · Mar 6, 2014

I found what I did wrong. thanks to Mr.KraneBird

I change my ajax code from this

$.ajax({
                            type: 'POST',
                            url: 'downloadfiles',
                            data: {value: str},
                            success: function(data) {
                                alert('ok' + data);
                            }
                        });

to this.

window.location.href = "<?php echo base_url().'downloadfiles/'?>" + str;

without posting it to the download_controller now i redirect to the download_controller.

now it is working well without any error.

thank you every one who waste your valuable time to help me.