За последние 24 часа нас посетили 16974 программиста и 1179 роботов. Сейчас ищут 1629 программистов ...

Проблемы, вызванные переименованием загружаемого файла

Тема в разделе "JavaScript и AJAX", создана пользователем Vladd55, 22 апр 2023.

  1. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Добрый день!

    Стоит такая задача: загружать графические файлы поочередно таким образом, чтобы загружаемый файл замещал предшествующий (см. скриншоты).

    Код файла такой:

    HTML:
    1. <script type="text/javascript" src="js/jquery-1.3.2.js"></script>
    2. <script type="text/javascript" src="js/ajaxupload.3.5.js"></script>
    3. <script type="text/javascript" >
    4.     $(function(){
    5.         var btnUpload=$('#upload');
    6.         var status=$('#status');
    7.         new AjaxUpload(btnUpload, {
    8.             action: 'upload-file-2.php',
    9.             name: 'uploadfile',
    10.             onSubmit: function(file, ext){
    11.                  if (! (ext && /^(jpg|png|jpeg|gif)$/.test(ext))){
    12.                    // extension is not allowed
    13.                    status.text('Поддерживаемые форматы JPG, PNG или GIF');
    14.                     return false;
    15.                 }
    16.                 status.text('Загрузка...');
    17.             },
    18.             onComplete: function(file, response){
    19.                 //On completion clear the status
    20.                 status.text('');
    21.                 //Add uploaded file to list
    22.                 if(response==="success"){
    23.                     $('#files').html('<li><img src="./intro/'+file+'" alt="" /><br />'+file+'</li>').addClass('success');
    24.                 } else{
    25.                     $('<li></li>').appendTo('#files').text('Файл не загружен' + file).addClass('error');
    26.                 }
    27.             }
    28.         });
    29.        
    30.     });
    31. </head>
    32. <div id="mainbody" >
    33.         <h3>Звгрузка графики</h3>
    34.         <!-- Upload Button, use any id you wish-->
    35.         <div id="upload" ><span>Выбрать файл<span></div><span id="status" ></span>
    36.        
    37.         <ul id="files" ></ul>
    38. </div>
    Код загрузчика upload-file-2.php:

    PHP:
    1.     $user_id = 12; // Для настройки. На практике берем из сессии
    2.     $data_img = getimagesize($_FILES['uploadfile']['tmp_name']);  // Размер и тип изображения
    3.     $type_img = [1 => 'gif', 2 => 'jpg', 3 => 'png'];
    4.     $type = $type_img[$data_img[2]];                            // Тип изображения
    5.     $upload_dir = $_SERVER['DOCUMENT_ROOT']."/intro/";  // Директория для записи изображения
    6. // Создаем уникальное имя файла изображения
    7.     $file_name  = $user_id . "-" . mt_rand(5000, 99000) . '.'.$type;
    8. //  Без переименования файла изображения
    9.     $file_name = $uploaddir . basename($_FILES['uploadfile']['name']);
    10. // Сохраняем это имя в текстовом файле. В реале сохраняется в базе
    11.     file_put_contents($user_id.'.txt', $file_name);
    12.     $new_image = $upload_dir.$file_name;    // Адрес изображения
    13.     move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $new_image);  // Перемещение на место хранения
    14.     echo "success";
    В таком виде нормально работает.

    Но на практике требуется переименовать загружаемый файл, присвоив ему уникальное имя. Для этого в данном примере нужно закомментировать строку $file_name = $uploaddir... . В этом случае файл с заданным именем успешно создается, но на странице не показывается (скриншот). Я так понимаю, что JS скрипт такой файл графики не видит.

    Как добиться того, чтобы переименованные графические файлы тоже показывались?
     

    Вложения:

  2. Visman

    Visman Новичок

    С нами с:
    22 апр 2023
    Сообщения:
    12
    Симпатии:
    2
    Адрес:
    Сибирь
    Вместо success можно вернуть сгенерированное имя файла и в onComplete получить его из response.
     
  3. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    HTML:
    1. <!doctype html>
    2. <html lang="en">
    3.     <meta charset="UTF-8">
    4.     <title>Document</title>
    5. <script type="text/javascript" src="js/jquery-1.3.2.js"></script>
    6. <script type="text/javascript" src="js/ajaxupload.3.5.js"></script>
    7. <script type="text/javascript" >
    8.     $(function(){
    9.         var btnUpload=$('#upload');
    10.         var status=$('#status');
    11.         new AjaxUpload(btnUpload, {
    12.             action: 'upload-file-2.php',
    13.             name: 'uploadfile',
    14.             onSubmit: function(file, ext){
    15.                 if (! (ext && /^(jpg|png|jpeg|gif)$/.test(ext))){
    16.                    // extension is not allowed
    17.                    status.text('Поддерживаемые форматы JPG, PNG или GIF');
    18.                     return false;
    19.                 }
    20.                 status.text('Загрузка...');
    21.             },
    22.             onComplete: function(file, response){
    23.                 //On completion clear the status
    24.                 status.text('');
    25.                 //Add uploaded file to list
    26.                let result = {success: false, file_name: undefined, ...JSON.parse(response)}
    27.  
    28.                 if(result.success){
    29.                     $('#files').html(`<li><img src="./intro/${result.file_name}" alt="" /><br />${result.file_name}</li>`).addClass('success');
    30.                 } else{
    31.                     $('<li></li>').appendTo('#files').text('Файл не загружен' + file).addClass('error');
    32.                 }
    33.             }
    34.         });
    35.  
    36.     });
    37. </head>
    38. <div id="mainbody" >
    39.     <h3>Звгрузка графики</h3>
    40.     <!-- Upload Button, use any id you wish-->
    41.     <div id="upload" ><span>Выбрать файл<span></div><span id="status" ></span>
    42.  
    43.     <ul id="files" ></ul>
    44. </div>
    PHP:
    1. <?php
    2. $user_id = 12; // Для настройки. На практике берем из сессии
    3. $data_img = getimagesize($_FILES['uploadfile']['tmp_name']);  // Размер и тип изображения
    4. $type_img = [1 => 'gif', 2 => 'jpg', 3 => 'png'];
    5. $type = $type_img[$data_img[2]];                            // Тип изображения
    6. $upload_dir = $_SERVER['DOCUMENT_ROOT']."/intro/";  // Директория для записи изображения
    7. // Создаем уникальное имя файла изображения
    8. $file_name  = $user_id . "-" . mt_rand(5000, 99000) . '.'.$type;
    9. //  Без переименования файла изображения
    10. //$file_name = $uploaddir . basename($_FILES['uploadfile']['name']);
    11. // Сохраняем это имя в текстовом файле. В реале сохраняется в базе
    12. file_put_contents($user_id.'.txt', $file_name);
    13. $new_image = $upload_dir.$file_name;    // Адрес изображения
    14. move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $new_image);  // Перемещение на место хранения
    15. exit(json_encode(['success' => true, 'file_name' => $file_name]));
     
    Vladd55 нравится это.
  4. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Спасибо, очень хорошо получилось!

    Но вскрылся один нюанс: хотелось бы иметь крестик для закрытия картинки, по клику на который одновременно запускался бы php-файл, удаляющий соответствующий графический файл. Как сделать этот php-файл я понимаю, а вот с Крестиком, его запускающим и закрывающим картинку, не выходит.

    Как это осуществить?

    Код (CSS):
    1. #upload{
    2.     margin:10px 30px; padding:10px;
    3.     font-weight:bold; font-size:12px;
    4.     font-family:Arial, Helvetica, sans-serif;
    5.     text-align:center;
    6.     background:#f2f2f2;
    7.     color:#3366cc;
    8.     border:1px solid #ccc;
    9.     width:140px;
    10. }
    11.  
    12. #status{
    13.     font-family:Arial; padding:5px;
    14. }
    15. ul#files{ list-style:none; padding:0; margin:0; }
    16. ul#files li{ padding:10px; margin-bottom:2px; width:200px; float:left; margin-right:10px;}
    17. ul#files li img{ max-width:160px; max-height:150px; }
     
  5. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    158
    Симпатии:
    41
    Адрес:
    Барнаул
    Например навешать на li data атрибут с именем файла и передавать на сервер.
    HTML:
    1.  $('#files').html(`<li data-file="${result.file_name}"><img src="./intro/${result.file_name}" alt="" /><br />${result.file_name} <button class="js_remove_image">Удалить</button></li>`).addClass('success')
    HTML:
    1. $(document).on('click', '.js_remove_image', function(e){
    2.     let $this = $(e.target);
    3.     let file = $this.closest('li').data('file');
    4.    
    5.     запрос на сервер ...
    6. });
     
  6. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    К сожалению, я этого не понял.
    Предположим, что на сервере нужно запустить файл с именем clear.php. Он из базы найдет возьмет имя нужного графического файла и удалит его. Но как clear.php вписать в скрипт?

    HTML:
    1. <script type="text/javascript" >
    2.     $(function(){
    3.         var btnUpload=$('#upload');
    4.         var status=$('#status');
    5.         new AjaxUpload(btnUpload, {
    6.             action: 'upload-file-5.php',
    7.             name: 'uploadfile',
    8.             onSubmit: function(file, ext){
    9.                 if (! (ext && /^(jpg|png|jpeg|gif)$/.test(ext))){
    10.                   // extension is not allowed
    11.                   status.text('Поддерживаемые форматы JPG, PNG или GIF');
    12.                     return false;
    13.                 }
    14.                 status.text('Загрузка...');
    15.             },
    16.             onComplete: function(file, response){
    17.                 //On completion clear the status
    18.                 status.text('');
    19.                 //Add uploaded file to list
    20.                let result = {success: false, file_name: undefined, ...JSON.parse(response)}
    21.                 if(result.success){
    22.                 $('#files').html(`<li data-file="${result.file_name}"><img src="./intro/${result.file_name}" alt="" /><br />${result.file_name} <button class="js_remove_image">Удалить</button></li>`).addClass('success');
    23.                 } else{
    24.                     $('<li></li>').appendTo('#files').text('Файл не загружен' + file).addClass('error');
    25.                 }
    26.             }
    27.         });
    28.     });
     
  7. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    912
    Симпатии:
    143
    харэ печь пирожки попрошайке
     
  8. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Не надо флудить, Вы нарушаете Правила форума.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    Получилось грубовато. Но по сути, тебе правильно ответили: уже хватит задавать вопросы такого уровня, мнэ... некомпетентности.

    Так же, как ты обращался любому другому php-скрипту. В твоём распоряжении есть get и post запросы. Почитай про это самостоятельно.
     
  10. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Я не нашел в Правилах требований к уровню компетенции вопросов. Но если Вы так считаете, то не буду - с Модератором не спорят.
     
  11. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    912
    Симпатии:
    143
    @Vladd55, ни в коем случае не хотел наехать, просто кучу информации можно найти пользуясь поисковыми системами.
     
    Vladd55 нравится это.
  12. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Я не профессионал, я психолог, и для меня JS чрезвычайно труден. На мой взгляд, нет ничего плохого, если бы мне, неумехе, Aleksandr.B написал бы рабочий код. Тем более, что он готов был это сделать, а Вы дали ему по рукам. Зачем? Кто от этого выиграл, в чем польза этих Ваших действий?

    Это еще как-то можно было понять, если бы шел огромный поток вопросов от других людей. Но их же совсем немного!

    Ну, я соберу все полученные здесь заготовки, пойду на другой форум и заново все объясню другим людям. Они помогут. Но в чем смысл всех этих дополнительных действий, когда этот ответ я мог бы получить здесь уже сегодня?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.102
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Vladd55 главный принцип форума: здесь не кормят рыбой, а учат её ловить. И то необязательно, а по настроению. Подразумевается что каждый ответ служит тебе уроком. Отсюда это вот всё.

    Удачи в учёбе!
    --- Добавлено ---
    Ты не JS учишь, ты борешся со своим незнанием принципов работы веб. "Обратиться к скрипту php" значит сделать запрос на сервер. Некоторые запросы вроде получения html или png файла обрабатываются веб-сервером, а некоторые передаются на исполнение php.
    Ты уже обращался к скрипту PHP из JS. Я помню твои затруднения с заменой формы. Здесь то же самое. Ты же не собираешся задавать этот вопрос про каждый новый скрипт на сервере — а как тебе его вызвать из JS?! ))
    --- Добавлено ---
    Как психолог, проанализируй свою обиду и пойми, что никто тебе ничего не должен. А коммуникации проходят легко только если нет взаимных претензий.
     
  14. Vladd55

    Vladd55 Новичок

    С нами с:
    11 дек 2021
    Сообщения:
    88
    Симпатии:
    1
    Ни про какие обиды не может быть и речи. И никаких претензий тем более. В каждом монастыре свой Устав. Действуйте, как считаете нужным - это же ваш сайт.

    Александру, который мне помог, я написал в личку благодарность. Бидону поставил плюсик. Модератору ответил, что подчиняюсь его требованию. Всё нормально. Мы же все независимые, свободные люди.

    К тому же, мою проблему мне уже решили, так что жизнь продолжается, идем дальше.