На моем сервере хранится несколько файлов, которые можно найти по идентификатору пользователя и по их адресу в моей таблице.
у них разные типы файлов, такие как docx, jpeg и pdf.
У меня есть метод jquery post, который отправит user_id в соответствующий php-файл, в котором я выполню свой запрос, чтобы получить адреса файлов пользователей в виде массива.
$("#download_btn").click(function () {
var uni_id = $("#uni_selection_filter").val();
$.post("Requests/zipCorsponds.php", //Required URL of the page on server
{ // Data Sending With Request To Server
Get_arch_letters : true,
user_id : vuser_id,
user_role : "<?php echo $_SESSION["role"]; ?>",
section_num : "<?php echo $_SESSION['section_id'] ?>",
uni_id : uni_id
},
function(response){ // Required Callback Function
$("#dynamic_table").html(response);
});
});
Теперь я добавил ниже метод после запроса, чтобы сжать эти файлы и отправить результат для просмотра, который jquery, что пользователь сможет загрузить все его / ее файлы.
if ($_POST['Get_arch_letters']) {
$user_id = $_POST['user_id'];
$user_role = $_POST['user_role'];
$section_num = $_POST['section_num'];
$uni_id = $_POST['uni_id'];
if ($user_role == 'executive_manager') {
$load_corspnd_letter = $DBM->RunQuery("SELECT at_corspond_file.corspond_file FROM at_corspnd
INNER JOIN at_corspond_file ON (at_corspnd.id = at_corspond_file.corspond_id)
WHERE at_corspnd.uni_id = '$uni_id' ", true, false);
}
$files = mysqli_fetch_assoc($load_corspnd_letter);
# create new zip opbject
$zip = new ZipArchive();
# create a temp file & open it
$tmp_file = 'Resume.zip';
$zip->open($tmp_file, ZipArchive::CREATE);
# loop through each file
foreach($files as $file){
if (!file_exists('../'.$file)) { die($file.' does not exist'); }
if (!is_readable('../'.$file)) { die($file.' not readable'); }
# download file
$download_file = file_get_contents('../'.$file);
#add it to the zip
$zip->addFile(basename($file),$download_file);
}
# close zip
$zip->close();echo 'Requests/'.$tmp_file;}
но что я получаю в результате: PK|H�IPK|H�I��PK.
как я могу это сделать?
Обновить
Я добавил условия, чтобы проверить, создан ли файл архива или нет, он проходит это условие, но в моем каталоге нет файла:
# create new zip opbject
$zip = new ZipArchive();
# create a temp file & open it
$tmp_file = 'Resume.zip';
if($zip->open($tmp_file, \ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true)
echo 'cannot create zip';
# loop through each file
foreach($files as $file){
if (!file_exists('../'.$file)) {
continue;
}
if (!is_readable('../'.$file)) { die($file.' not readable'); }
#add it to the zip
$zip->addFile(basename($file));
}
# close zip
$zip->close();echo 'Requests/'.$tmp_file;
Вы не можете скачать файл с вашим подходом. Прямо сейчас ваш код пытается дисплей результат вашего звонка на сервер.
У вас есть 2 варианта, чтобы сделать эту работу.
1. Используя ваш текущий код PHP
PHP-код будет работать, если вызывается прямо в браузере. Вы можете использовать свой '#download_btn'
отправить форму с правильными значениями ввода
HTML
<form action="Requests/zipCorsponds.php" method="post" id="frm">
<input type="hidden" name="Get_arch_letters" value="true" />
<input type="hidden" name="user_role" value="<?php echo $_SESSION["role"]; ?>" />
...
<input type="hidden" name="uni_id" id="uni_id" value="" />
</form>
JQuery
$("#download_btn").click(function () {
var uni_id = $("#uni_selection_filter").val();
$("#uni_id").val(uni_id);
$("#frm").submit();
});
.
2. Используя ваш текущий подход к посту jquery
Вам нужно будет изменить функцию обратного вызова, чтобы загрузить возвращенный файл.
JQuery
...
function(response){ // Required Callback Function
window.location = response;
});
...
И изменить код php, чтобы вернуть путь к файлу, а не сам файл. Вам также необходимо указать имя файла с правильным расширением.
PHP
...
# create a file & open it
$tmp_file = 'Resumes.zip';
$zip->open($tmp_file, ZipArchive::CREATE | ZipArchive::OVERWRITE);
# loop through each file
foreach($files as $file){
if (!file_exists('../'.$file)) { die($file.' does not exist'); }
if (!is_readable('../'.$file)) { die($file.' not readable'); }
#add file to the zip
$zip->addFile(basename('../'.$file));
}
# close zip
$zip->close();
# send the file to the post request
echo 'Requests/'.$tmp_file;
Других решений пока нет …