JQuery Ajax Calls - Периодические проблемы с отображением изображений (Chrome & FF) (некоторые PHP и MySQL)

0

Я использую JQuery для получения данных формы и отправки XMLHttpRequest(); Я открываю запрос, используя метод POST. Изображение и дополнительные данные передаются скрипту PHP, который обрабатывает, изменяет размеры и сохраняет его на сервере. Имя файла и местоположение изображения обновляются в соответствующих полях в базе данных MySQL. На uploadComplete(evt) я пытаюсь отобразить недавно загруженное изображение, вызвав .load() чтобы заполнить div.

80% времени изображение отображается правильно, когда содержимое загружается в div. 20% времени изображение отображается так, как если бы ссылка была сломанной ссылкой. Однако, если я обновляю страницу, изображение отображается правильно.

Почему изображение иногда отображается как неработающая ссылка?

Как я могу остановить это от этого?

* РЕДАКТИРОВАТЬ

    function loadFile() 
{
    var fileURL = $( "#url" ).val();
    if(fileURL == "")
    {
        // Retrieve the FileList object from the referenced element ID
        var myFileList = document.getElementById('upload_file').files;

        // Grab the first File Object from the FileList
        var myFile = myFileList[0];

        // Set some variables containing the three attributes of the file
        var myFileName = myFile.name;
        var myFileSize = myFile.size;
        var myFileType = myFile.type;

        // Let upload the complete file object
        imageUpdate(myFile);
    }
    else
    {
        var newinfo = new Array();
        newinfo[0] = "URL";
        newinfo[1] = fileURL;
        imageUpdate(newinfo);
    }
}

    function imageUpdate(newinfo)
    {
        var formData = new FormData(); // data object
        // extra
        var stylistID = $( "#editThisStylist" ).data('stylistid');  // Grab stlyistID
        formData.append("stylistID", stylistID);

        // IF URL
        if ( newinfo[0] == "URL" ){
            formData.append("type", "URL"); 
            formData.append("url", newinfo[1]);
        }
        // IF LOCAL FILE
        else
        {
            formData.append("type", "FILE");
            // Append our file to the formData object
            // Notice the first argument "file" and keep it in mind
            formData.append('my_uploaded_file', newinfo);
        }

            // Create our XMLHttpRequest Object
            var xhr = new XMLHttpRequest();

            xhr.addEventListener("progress", updateProgress, false);
            xhr.addEventListener("load", uploadComplete, false);
            xhr.addEventListener("error", transferFailed, false);
            xhr.addEventListener("abort", transferCanceled, false);

            // Open our connection using the POST method
            xhr.open("POST", "u/stylist_avatar.php", true);

            // Request headers
            //xhr.setRequestHeader("Content-Type", formData.files[0].type);

            // Send the file
            xhr.send(formData);
    }

    // While xhr is in progress
    function updateProgress(oEvent)
    {  
        if (evt.lengthComputable) 
        {  
            //var progressBar = document.getElementById("progressBar");
            //var percentComplete = oEvent.loaded / oEvent.total;
            //progressBar.value = percentComplete;
        } 
        else 
        {
            // unable to compute progress information since the total size is unkown
        }
    }

    // onComplete
    function uploadComplete(evt) {
        //alert("The transfer is complete.");
        resetForm($('#uploadImageForm'));

        var stylistID = $( "#editThisStylist" ).data('stylistid');  // Grab stlyistID
        $('#uploadImageModal').modal('toggle');

        // Reload right div
        $( "#editStylistRight" ).load( "u/stylist_lookup.php", {stylistID: stylistID}, function (){});
        // Reload stylist list
        var index = 0;
        var numRecords = 10;
        $( "#stylistTable" ).load( "u/stylist_lookuptable.php", {start: index, end: numRecords}, function (){});
    }

    function transferFailed(evt) {
        alert("An error occurred while transferring the file.");
    }

    function transferCanceled(evt) {
        alert("The transfer has been canceled by the user.");
    }
  • 0
    Я надеюсь, что вы используете JQuery AJAX, а не свою собственную функцию. Но мы не узнаем, пока вы не покажете нам код
  • 0
    Я добавил свой код в соответствии с просьбой. Я думаю, что это правильный путь. Может быть, немного хакерский, но это работает.
Теги:
mysqli

2 ответа

0

Кажется, что вы пытаетесь показать новое изображение до того, как скрипт PHP фактически создаст и сохранит новое изображение.

Вместо вызова функции javascript, загружающей новое изображение в "uploadComplete", используйте параметр "success" (если вы используете функцию jQuery $.ajax), которые вызывают функцию, загружающую новое изображение.

Функция "успех" вызывается только тогда, когда сервер завершает обработку запроса (когда скрипт PHP заканчивает редактирование и сохранение изображения), а не когда новые параметры изображения были успешно отправлены на сервер.

  • 0
    Я мог ошибаться, но я думал, что событие uploadComplete для XMLHttpRequest(); был запущен только после того, как файл был полностью загружен? Я могу ошибаться. И я использую $ .ajax для большинства моих звонков, но я не знаю, как реализовать это с помощью загрузки изображений.
  • 0
    Если событие uploadComplete инициируется, когда файл полностью загружен, PHP-сценарий обработает изображение одновременно с запросом javascript для нового изображения. Это объясняет, почему иногда работают, а иногда не работают. Иногда сценарий PHP сохраняет новое изображение перед его запросом javascript, а иногда сценарий javascript запрашивает новое изображение перед его сохранением в сценарии PHP.
0

Это происходит из-за кеша изображения, принудительного браузера для получения изображения evrytime. используйте это в uploadcomplete event

var timestamp = new Date();
timestamp   = timestamp.getTime();
imageurl+'?t='+timestamp;
  • 0
    Похоже, вы предлагаете передать текущее время как переменную GET для источника изображений? Следует отметить, что каждое загруженное изображение имеет уникальный источник, поэтому, даже если предыдущее было кэшировано, самое новое не должно быть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню