Как вызвать функцию с параметром для принудительной загрузки в codeigniter - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу вызвать функцию загрузки, когда нажимаю кнопку «Загрузить текст», но мой href всегда показывает ошибку php.Я застрял здесь и запутался, как это сделать.

Это мой взгляд:

<?php $i=1; foreach($map as $dokumen)
{
?>
    <tr>
    <th scope="row"><?php echo $i?></th>
    <td><?php echo $dokumen?></td>
    <td><?php $path = 'file/dokumenkp/' . $dokumen;?>
    <a href="<?php echo base_url(). 'dokumenkp/downloadfiles' . $path['path']; ?>">Download</a>
    </td>
    </tr>
<?php $i++?>
<?php
}?>

И это моя функция в Контроллере:

public function downloadfiles($path)
{
    force_download($path, NULL);
}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Мне кажется, есть пара синтаксических ошибок.Основной находится в этих строках.

<td><?php $path = 'file/dokumenkp/' . $dokumen;?>
<a href="<?php echo base_url(). 'dokumenkp/downloadfiles' . $path['path']; ?>">Download</a>

В первой строке $path определен и является строкой, но во второй строке он рассматривается как массив, т.е.$path['path'].Это приведет к ошибке.

Но проблема все еще существует, если во второй строке в качестве строки используется $path, то есть

<a href="<?php echo base_url(). 'dokumenkp/downloadfiles' . $path; ?>">Download</a>

Проблема заключается в том, чтоотсутствие разделителя каталогов между 'dokumenkp/downloadfiles' и $path.

Вот код, который решает все проблемы.Это также немного изменено, чтобы быть, ИМХО, немного чище.(Обратите внимание, как вы можете использовать «предварительное увеличение» на счетчике $i до его отображения.)

<?php 
$i=0; 
foreach($map as $dokumen)
{
    $path = 'file/dokumenkp/' . $dokumen;
?>
    <tr>
        <th scope="row"><?php echo ++$i; ?></th>
        <td><?php echo $dokumen; ?></td>
        <td><a href="<?php echo base_url('dokumenkp/downloadfiles/' . $path); ?>">Download</a></td>
    </tr>
    <?php 
} ?>

Когда вы переходите к методу контроллера downloadfiles($path), необходимо выполнить несколько действий$path будь тем, что тебе нужно.

Первая проблема заключается в том, что $path - это строка с серией символов '/' в ней.CodeIgniter собирается интерпретировать каждый элемент после косой черты как еще один аргумент функции.Другими словами, каждый разделенный слэшем сегмент $path станет другой переменной.Есть несколько способов справиться с этим фактом.

Эта проблема не существовала бы, если бы мы отправили только имя файла - например, downloadfiles('Pedoman.pdf') - туда, где путь может быть добавлен перед именем файла.Но для этого необходимо, чтобы все загрузки происходили из одной и той же папки.Ваше требование - для разных папок с исходными файлами для скачивания, поэтому нам придется преобразовать $path обратно в полезную строку.

Это не очень сложно сделать, но части фреймворка, которые мы будем использовать, на самом деле не требуют определения каких-либо входных параметров для функции downloadfiles().Поэтому мы даже не будем отправлять их.

Следующая проблема заключается в том, что для функции force_download() требуется абсолютный путь (полный путь от корня диска).Предполагая, что папка «file» находится на том же уровне, что и «application», мы можем использовать FCPATH в качестве начального места.(FCPATH - это полный путь к папке, где находится CodeIgniter index.php.)

Вот версия downloadfiles(), которая выполняет все эти задачи - и немного больше.

public function downloadfiles()
{
    // get the array of the URI segments after the controller/method parts
    $segs = array_slice($this->uri->segments, 2);
    // turn that array into an "absolute path" string 
    $fullpath = FCPATH . implode("/", $segs);

    // add a check to see if that path/file exists
    if( ! file_exists($fullpath)){
        echo "File $fullpath not found";
        return;
    }

    force_download($fullpath, NULL);
}

Дайте мне знать, как это работает.

0 голосов
/ 01 декабря 2018

Попробуйте приведенный ниже пример и укажите полный путь, используя getcwd()

public function downloadfiles($path){

            $name = 'YourFileName';
            $path = getcwd().$path;
            $mime = get_mime_by_extension(getcwd().$path);
            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).'"');  
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: '.filesize($path)); // provide file size
            header('Connection: close');
            readfile($path); // push it out
            exit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...