Я пытаюсь сделать модуль вложения для веб-сайта. Вот скрипт контроллера Attachments Attachments.php
<?php
class Attachments extends Controller {
public function __construct(){
}
public function index(){
$data = [
'title' => 'Attachments',
'description' => 'Area for attachments and uploads'
];
$this->loadView('attachments/index', $data);
}
public function save(){
$data = [
'title' => 'Attachments',
'description' => 'Area for attachments and uploads'
];
$fileName = $_FILES['file']['name'];
$fileTmpName = $_FILES['file']['tmp_name'];
$fileSize = $_FILES['file']['size'];
$fileError = $_FILES['file']['error'];
$fileType = $_FILES['file']['type'];
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt));
$fileNameNew = uniqid('',true).".".$fileActualExt;
$fileDestination = '/app/attachments/'.$fileNameNew;
if(move_uploaded_file($fileTmpName, $fileDestination)){
return true;
} else{
return false;
}
}
public function remove($files){
$data = [
'title' => 'Attachments',
'description' => 'Area for attachments and uploads'
];
foreach($files as $file){
$fileName = $file['fileName'];
$filetoDel = $_SERVER['DOCUMENT_ROOT'] . '/app/attachments/' .$fileName;
if (file_exists($filetoDel)) {
unlink($file);
} else {
// File not found.
}
}
}
}
и вот вид вложения
<?php require APPROOT . '/views/inc/header.php'; ?>
<div class="jumbotron jumbotron-flud text-center">
<div class="session col-md-4 mx-auto">
<?php echo flash('session_message');?>
</div>
<div class="container">
<h1 class="display-3"><?php echo $data['title']; ?></h1>
<p class="lead"><?php echo $data['description']; ?></p>
</div>
<div class="container">
<div class="row">
<form id="attatchments" method="post" enctype="multipart/form-data">
<input id="files" type="file" name="files" />
<input type="submit" name="save" value="Save"/>
</form>
</div>
</div>
<script>
jQuery(function ($) {
$('#files').shieldUpload({
async: {
enabled: true,
save: {
url: "/attachments/save"},
remove: {
url: "/attachments/remove"}
}
});
});
</script>
</div>
<?php require APPROOT . '/views/inc/footer.php'; ?>
Сценарий, css и начальная загрузка упоминаются в файлах /views/inc/header.php /views/inc/footer.php
URL-адрес сохранения должен вызывать функцию сохранения, поскольку URL-адрес / attachments / save указывает загрузчику найти Attachments.php и загрузить функцию save ().
Есть ли способ отладить это, так как при тестировании не было сохранено ни одного файла, однако, похоже, он запускает скрипт …
Я уже несколько недель ломаю голову, пытаясь понять, как заставить это работать. Я мог бы просто не использовать shieldui и сделать простой, однако я хотел бы использовать sheildUI для управления несколькими файлами. Кроме того, потому что я заплатил за лицензию разработчика, поэтому я предпочел бы использовать инструменты как можно больше.
Я выполнил поиск на Youtube, и все они, кажется, одобряют код, который у меня есть под функцией сохранения для загрузки отдельных файлов, и из документации компонент щитового интерфейса передает каждый файл по одному, вызывая функцию сохранения для каждого файла?
— Мне удалось заставить его работать, как ответили ниже, для загрузки файлов. Однако я использую массив $ _FILES. Это правильно, или я должен передавать файл за один раз из shieldUI. Я не уверен, как это сделать? Я сейчас изо всех сил пытаюсь отыскать для удаления файлов.
Заранее большое спасибо за вашу помощь.
Я отошел, выспался и вернулся к этому. Я решил, что мне не нужен индексный файл в каждой строке. Мне также нужно было использовать ../ вместо / в пути к файлу назначения. Моя функция сохранения в контроллере теперь выглядит так:
public function save(){
$data = [
'title' => 'Attachments',
'description' => 'Area for attachments and uploads'
];
foreach($_FILES as $file){
$fileName = $file['name'];
$fileTmpName = $file['tmp_name'];
$fileSize = $file['size'];
$fileError = $file['error'];
$fileType = $file['type'];
$fileExt = explode('.', $fileName);
$fileActualExt = strtolower(end($fileExt));
$fileNameNew = uniqid('',true).".".$fileActualExt;
$fileDestination = '../app/attachments/'.$fileNameNew;
if(move_uploaded_file($fileTmpName, $fileDestination)){
return true;
} else{
return false;
}
}
}
Других решений пока нет …