Есть запрос на ajax, после того как файл загружается на сервер, хочу вывести его на страницу в виде ссылки на скачивание, подскажите как HTML страница HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Журнал по информацинной безопасности</title> <link rel="stylesheet" type="text/css" href="css\Положения.css"> <script type="text/javascript" src="js\polozauto.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> </head> <body> <div class = "section_header"> <img id ="emblema" onclick="start()" src="css\эмблема.png"> <p id="zag">Организационно-распорядительная документация по информационной безопасности</p> </div> <div class="maincontainer"> <!--Блок сайта без шапки--> <div class="blockbutton"> <!--Блок с кнокпками, в него вложены элементы для ввода логина и пароля--> <button class="buttonchoose" onclick="poloz()">Положения</button> <button class="buttonchoose" onclick="rukovod()">Руководства</button> <button class="buttonchoose" onclick="koncep()">Концепции</button> <button class="buttonchoose" onclick="instuction()">Инструкции</button> <div class="log"> </div> </div> <div class="content"> <h1>Положения</h1> <div class="maincontent"> <form action="up2.php"> <p><a class = "linkdoc" href="файлы\Положения\Положение о Межведомственной комиссии по защите государственной тайны. Утверждено Указом Президента Российской Федерации от 6.10.2004 г. № 1286.doc">Положение о Межведомственной комиссии по защите государственной тайны. Утверждено Указом Президента Российской Федерации от 6.10.2004 г. № 1286</a></p> <p><a class = "linkdoc" href="файлы\Положения\Положение о сертификации средств защиты информации по требованиям безопасности информации. Утверждено Приказом председателя Гостехкомиссии России от 27.10.1995 г. № 199.doc">Положение о сертификации средств защиты информации по требованиям безопасности информации. Утверждено Приказом председателя Гостехкомиссии России от 27.10.1995 г. № 199</a></p> <p><a class = "linkdoc" href="файлы\Положения\Положение о сертификации средств защиты информации. Утверждено постановлением Правительства Российской Федерации от 26.06.1995 г. № 608.doc">Положение о сертификации средств защиты информации. Утверждено постановлением Правительства Российской Федерации от 26.06.1995 г. № 608</a></p> <p><a class = "linkdoc" href="файлы\Положения\Положение о Федеральной службе по техническому и экспортному контролю. Утверждено Указом Президента Российской Федерации от 16.08.2004 г. № 1085.doc">Положение о Федеральной службе по техническому и экспортному контролю. Утверждено Указом Президента Российской Федерации от 16.08.2004 г. № 1085</a></p> <p><a class = "linkdoc" href="файлы\Положения\Типовое положение об органе по сертификации средств защиты информации по требованиям безопасности информации. Утверждено Приказом председателя Гостехкомиссии России от 5.01.1996 г. № .doc">ПТиповое положение об органе по сертификации средств защиты информации по требованиям безопасности информации. Утверждено Приказом председателя Гостехкомиссии России от 5.01.1996 г. № </a></p> <p><a href="" style="display: none;" id = "translate_a" class = "linkdoc">rfghbsfhgbshbg</a></p> </form> <input type="file" multiple="multiple" > <a href="#" class="upload_files button">Загрузить файлы</a> <div class="ajax-reply"></div> <script> (function($){ var files; // переменная. будет содержать данные файлов // заполняем переменную данными файлов, при изменении значения file поля $('input[type=file]').on('change', function(){ files = this.files; }); // обработка и отправка AJAX запроса при клике на кнопку upload_files $('.upload_files').on( 'click', function( event ){ event.stopPropagation(); // остановка всех текущих JS событий event.preventDefault(); // остановка дефолтного события для текущего элемента - клик для <a> тега // ничего не делаем если files пустой if( typeof files == 'undefined' ) return; // создадим данные файлов в подходящем для отправки формате var data = new FormData(); $.each( files, function( key, value ){ data.append( key, value ); }); // добавим переменную идентификатор запроса data.append( 'my_file_upload', 1 ); // AJAX запрос $.ajax({ url : './submit.php', type : 'POST', data : data, cache : false, dataType : 'json', // отключаем обработку передаваемых данных, пусть передаются как есть processData : false, // отключаем установку заголовка типа запроса. Так jQuery скажет серверу что это строковой запрос contentType : false, // функция успешного ответа сервера success : function( respond, status, jqXHR ){ // ОК if( typeof respond.error === 'undefined' ){ // файлы загружены, делаем что-нибудь // покажем пути к загруженным файлам в блок '.ajax-reply' } // error else { console.log('ОШИБКА: ' + respond.error ); } }, // функция ошибки ответа сервера error: function( jqXHR, status, errorThrown ){ console.log( 'ОШИБКА AJAX запроса: ' + status, jqXHR ); } }); }); })(jQuery) </script> </div> </div> </div> </body> </html> php скрипт PHP: <?php if( isset( $_POST['my_file_upload'] ) ){ // ВАЖНО! тут должны быть все проверки безопасности передавемых файлов и вывести ошибки если нужно $uploaddir = './uploads'; // . - текущая папка где находится submit.php // cоздадим папку если её нет if( ! is_dir( $uploaddir ) ) mkdir( $uploaddir, 0777 ); $files = $_FILES; // полученные файлы $done_files = array(); // переместим файлы из временной директории в указанную foreach( $files as $file ){ $file_name = cyrillic_translit( $file['name'] ); if( move_uploaded_file( $file['tmp_name'], "$uploaddir/$file_name" ) ){ $done_files[] = realpath( "$uploaddir/$file_name" ); } } $data = $done_files ? array('files' => $done_files ) : array('error' => 'Ошибка загрузки файлов.'); die( json_encode( $data ) ); } ## Транслитирация кирилических символов function cyrillic_translit( $title ){ $iso9_table = array( 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Ѓ' => 'G', 'Ґ' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'YO', 'Є' => 'YE', 'Ж' => 'ZH', 'З' => 'Z', 'Ѕ' => 'Z', 'И' => 'I', 'Й' => 'J', 'Ј' => 'J', 'І' => 'I', 'Ї' => 'YI', 'К' => 'K', 'Ќ' => 'K', 'Л' => 'L', 'Љ' => 'L', 'М' => 'M', 'Н' => 'N', 'Њ' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ў' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'TS', 'Ч' => 'CH', 'Џ' => 'DH', 'Ш' => 'SH', 'Щ' => 'SHH', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'ѓ' => 'g', 'ґ' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'є' => 'ye', 'ж' => 'zh', 'з' => 'z', 'ѕ' => 'z', 'и' => 'i', 'й' => 'j', 'ј' => 'j', 'і' => 'i', 'ї' => 'yi', 'к' => 'k', 'ќ' => 'k', 'л' => 'l', 'љ' => 'l', 'м' => 'm', 'н' => 'n', 'њ' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ў' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'ts', 'ч' => 'ch', 'џ' => 'dh', 'ш' => 'sh', 'щ' => 'shh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya' ); $name = strtr( $title, $iso9_table ); $name = preg_replace('~[^A-Za-z0-9\'_\-\.]~', '-', $name ); $name = preg_replace('~\-+~', '-', $name ); // --- на - $name = preg_replace('~^-+|-+$~', '', $name ); // кил - на концах return $name; }
Фаил когда загружается на сервер, в какой директории он лежит? Допустим у тебя на сервере есть папка file куда ты загружаешь все свои скачанные файлы. Просто сканируешь ее и выводишь: PHP: $dir = '/file'; $files = scandir($dir); $result = ""; foreach($files as $file){ $result .='<a href="'.base_url().$dir.'" >'.$file.'</a>'; //полный путь где лежит фаил } return json_encode($result); А ajax запрос может выглядеть так: Код (Javascript): $.getJSON( "file.php", function(data) { console.log(data); });
пытаюсь интегрировать в свой код, и что-то не пашет, не подскажите куда это вставлять? файлы лежат в директории /uploads
Для начала открой чистый php фаил, там же где лежит рабочий фаил. И посмотри что получится, без ajax. Вместо return json_encode($result); напиши echo $result; Если все пройдет без ошибок и увидишь ссылки, попробуй перейди по ним. А потом уже встраивай в основной фаил.
Чтобы внести ясность, занимаюсь php 2 дня(заставила судьба нелёгкая), поэтому, если вам не трудно, опишите алгоритм подробнее. Я создал чистый php файл, там же, где лежит и основной, залил туда тот код, что вы предложили, заменил эхо, но тут до меня доходит, что это всё надо как-то друг на друга подвязать, а вот как это сделать...
Вот смотрите, вы дали код. Он я так понимаю рабочий (в сам код я не вникал). Вы пишете что фаил скачивается на сервер. Если он скачался на сервер, значит он где то там лежит. Вы физически его там можете найти? Если ответ да, то создаете 2ой php в нем пишете функцию поиска этих файликов. Встраиваете в свой текущий код только ajax запрос к этому 2ому фаилику. Если же физически на сервере этих файлов нет, значит вы их скачиваете на клиент себе. И выложить их для скачивания для других таким образом нельзя. Так что пункт один, проверить если ли там файлы, и вывести их как ссылки на страницу. Потом попробовать перейти по ним со ссылки. И уже только потом, если все работает, писать ajax запрос.
Да, физически файлы найти могу, создал отдельный файл php, в котором находится сканирование директории с файлами. Как я понимаю, в результате сканирования всё находится в переменной $result. Столкнулся с тем, что не понимаю, в моём коде, который Код (Javascript): <script> (function($){ var files; // переменная. будет содержать данные файлов // заполняем переменную данными файлов, при изменении значения file поля $('input[type=file]').on('change', function(){ files = this.files; }); // обработка и отправка AJAX запроса при клике на кнопку upload_files $('.upload_files').on( 'click', function( event ){ event.stopPropagation(); // остановка всех текущих JS событий event.preventDefault(); // остановка дефолтного события для текущего элемента - клик для <a> тега // ничего не делаем если files пустой if( typeof files == 'undefined' ) return; // создадим данные файлов в подходящем для отправки формате var data = new FormData(); $.each( files, function( key, value ){ data.append( key, value ); }); // добавим переменную идентификатор запроса data.append( 'my_file_upload', 1 ); // AJAX запрос $.ajax({ url : './submit.php', type : 'POST', data : data, cache : false, dataType : 'json', // отключаем обработку передаваемых данных, пусть передаются как есть processData : false, // отключаем установку заголовка типа запроса. Так jQuery скажет серверу что это строковой запрос contentType : false, // функция успешного ответа сервера success : function( respond, status, jqXHR ){ // ОК if( typeof respond.error === 'undefined' ){ // файлы загружены, делаем что-нибудь $.getJSON( "new.php", function(data) { console.log(data); }); // покажем пути к загруженным файлам в блок '.ajax-reply' } // error else { console.log('ОШИБКА: ' + respond.error ); } }, // функция ошибки ответа сервера error: function( jqXHR, status, errorThrown ){ console.log( 'ОШИБКА AJAX запроса: ' + status, jqXHR ); } }); }); })(jQuery) </script> я пытаюсь вставить ajax запрос в ajax запрос, как я понял(на место, где находятся комментарии "// файлы загружены, делаем что-нибудь"). Но закрадывается мысль, что это неправильно. Как лучше сделать?
Я таки прочитал твой код полностью. У тебя же заложенно в твоем ajax запросе ссылки на твоих файлы, не нужен 2ой ajax запрос и уж темболее 2ой файлик. $done_files это массив с путями к файлам. Если запись прошла успешно они возвращаются у тебя твоим ajax. Их просто надо вставить в href. Я с телефона, не удобно, сам разберешься? Код (Text): // покажем пути к загруженным файлам в блок '.ajax-reply' это тестовое задание что ли было какое?
Обещать, что разберусь не буду) Но сегодня буду пытаться. Если нет, завтра отпишусь. Спасибо вам большое за помощь Не поверите, курсач
Да тут разобиратся 2 минутки, выведи в консоль что приходит при успешной записи. Код (Javascript): console.log(respond) в консоль смотреть умеешь? F12
не, ну в консоль смотреть я умею) а выводит вот что {files: Array(1)} files: Array(1) 0: "D:\OSPanel\domains\zxc.ru\uploads\grafik.docx" length: 1 __proto__: Array(0) __proto__: Object Кажется я понял, только такой вопрос, как мне обратиться к этому нулевому элементу массива? Собственно, как сформировать рабочую ссылку
ругается Положения после авторизации.html:84 Uncaught TypeError: Cannot read property 'files' of undefined at Object.success (Положения после авторизации.html:84) at l (jquery.min.js:4) at Object.fireWith [as resolveWith] (jquery.min.js:4) at k (jquery.min.js:6) at XMLHttpRequest.<anonymous> (jquery.min.js:6) success @ Положения после авторизации.html:84 l @ jquery.min.js:4 fireWith @ jquery.min.js:4 k @ jquery.min.js:6 (anonymous) @ jquery.min.js:6 load (async) send @ jquery.min.js:6 ajax @ jquery.min.js:6 (anonymous) @ Положения после авторизации.html:68 dispatch @ jquery.min.js:5 y.handle @ jquery.min.js:5 Только я поменял respont on respond
Воот а теперь последний штрих пиши там же: var href = '<a href="'+respond['files'][0]+'">'+respond['files'][0]+'</a>'; $(".ajax-reply").html(href); консоль можешь убрать кавычки там не перепутай
Человек, ты просто гений(это не сарказм) выводит, но выводит прям полный путь, и по идее, ссылка не работает(я хотел чтобы выводилось только название файла на русском и, собственно, можно было скачать).при нажатии на ссылку ругается, что "Not allowed to load local resource: file:///D:/OSPanel/domains/zxc.ru/uploads/gotovaya_statya.doc". Выглядит так. Но, собственно, я для чего всё это затеял, я хотел, чтобы у меня потом эта ссылка оставалась, даже когда страницу перезагружу. Такое вообще возможно? До этого я такого же примерно результата добился использованием iframe и тд. Но мне подсказали, что легче сделать через аjax, чтобы не мучить с сессиями. Вот и я пошёл пытаться делать то, что вы сегодня в меня вдалбливали
Можно конечно, ajax нужен чтобы после нажатия на кнопку список сразу обновился. А чтобы отображалось при загрузке вам надо выводить это в пхп черес echo. И в данном случае выйдет только один фаил. Чтоб вышли все файлы в папке, нужно использовать foreach.
Для этого мне нужно создавать новый файл php или можно там же, где и загрузку файла писал? И, опять же, я в пхп сканирую директорию и вывожу через echo и foreaсh, я правильно понял этот процесс?
Подсказки ради допиши в html внутри блока: HTML: <div class="ajax-reply"> <?php echo '<a href="#">тут будет ссылка</a>'; </div> По идее туда надо будет вставить строку из другово пхп файла. Этот фаил подключить в начале html документа. Разберешся как нибудь.
Ничего не понимаю, написал вот такую штуку, чтобы пока хотя бы в консоль выводить список файлов из папки, но даже это не работает. пытался писать какие-то include, но они тоже не помогали PHP: <?php $dir = '/uploads'; $files = scandir($dir); foreach ($files as $file): console.log($file); endforeach; ?> и также не могу понять, как это всё подвязать к тому, что вы вчера предложили HTML: <div class="maincontent"> <div class="ajax-reply"> <?php echo '<a href="#">тут будет ссылка</a>'; </div> <input type="file" multiple="multiple" > <a href="#" class="upload_files button">Загрузить файлы</a>
сейчас пытался использовать вот этот код( вы его вчера в связке с ajax предлагали) PHP: $dir = '/uploads'; $files = scandir($dir); $result = ""; foreach($files as $file){ $result .='<a href="'.base_url().$dir.'" >'.$file.'</a>'; //полный путь где лежит фаил } но он выводит в виде ссылки только "'.$file.'"