Мне кажется, есть пара синтаксических ошибок.Основной находится в этих строках.
<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);
}
Дайте мне знать, как это работает.