загрузить изображение и изменить источник существующего изображения

#javascript #jquery

#javascript #jquery

Вопрос:

Мне нужно загрузить изображение и установить источник существующего изображения для этого загруженного
изображение загружено, но новый источник не работает

 <img class='avat' id='avat' src='ph/avat.jpg' alt='img'>
<input type='file' id='inpfile' accept=".jpg">
  

js

 var imgavat = $('#avat');
var inpfile = $('#inpfile');
inpfile.on('change', function(){
    var uid = $('.aact').attr('data-id');
    var file = $(this).prop('files')[0];
    var form = new FormData();
    form.append('inpfile', file);
    form.append('uid', uid);
    $.ajax({
        url: "a_members_pro_plus.php",
        type: 'post',
        cache: false,
        contentType: false,
        processData: false,
        data: form,
        success: function(data){
            console.log(data); // avat/1.jpg - new source - ok
            imgavat.attr('src', data);  // doesn't work
            inpfile.val('');
        }
    });
});
  

Комментарии:

1. Какое значение data в ответе?

2. @RRK — avat/1.jpg

3. Есть ли у вас какие-либо другие элементы на странице с идентификатором avat ?

4. @RRK — нет, это только одно изображение на странице — ярлык для аватара

Ответ №1:

Вы можете объединить FileReader с .readAsDataURL(), чтобы получить файл и заменить его на avatar .

Когда вы выбираете файл на своем локальном компьютере с помощью inpfile, запускается событие изменения.

В этом случае вам нужно проверить, есть ли один файл (пользователь выбрал файл):

 this.files[0]
  

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

 var reader  = new FileReader();
    reader.onloadend = function () {
  

Когда файл будет полностью загружен, вы можете изменить атрибут вашего аватара:

 imgavat.attr('src', reader.result);
  

Чтобы запустить этот асинхронный процесс, вам необходимо прочитать файл как URL-адрес данных, чтобы вы могли обновить изображение avatar src:

 reader.readAsDataURL(this.files[0]);
  

Фрагмент:

 var imgavat = $('#avat');
var inpfile = $('#inpfile');
inpfile.on('change', function() {
    if (this.files[0]) {   
        var reader  = new FileReader();
        
        reader.readAsDataURL(this.files[0]);
        
        reader.onloadend = function () {
            imgavat.attr('src', reader.result);
        };
    }
});  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<img class='avat' id='avat' src='ph/avat.jpg' alt='img'>
<input type='file' id='inpfile' accept=".jpg">  

Комментарии:

1. не могли бы вы объяснить, пожалуйста? где код для загрузки изображения? Мне нужно, чтобы оно было загружено в определенную папку. Я попытался поместить ваш код внутри success части моего кода и получил ошибку

2. @да, я понимаю, спасибо. Теперь это работает. Есть ли у вас какие-либо идеи, почему мой предыдущий код не работал?

3. @qadenza Напишите // … код для загрузки изображения , и я посмотрю, и поэтому я могу сказать вам больше…

4. пожалуйста, посмотрите мое пост-обновление. это полный js-код. Если вам нужен php-код — без проблем, но по сути это работает — загруженное изображение есть

5. @qadenza можете ли вы добавить значение console.log(данные); ? Спасибо