Я использую 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.");
}
Кажется, что вы пытаетесь показать новое изображение до того, как скрипт PHP фактически создаст и сохранит новое изображение.
Вместо вызова функции javascript, загружающей новое изображение в "uploadComplete", используйте параметр "success" (если вы используете функцию jQuery $.ajax), которые вызывают функцию, загружающую новое изображение.
Функция "успех" вызывается только тогда, когда сервер завершает обработку запроса (когда скрипт PHP заканчивает редактирование и сохранение изображения), а не когда новые параметры изображения были успешно отправлены на сервер.
uploadComplete
для XMLHttpRequest();
был запущен только после того, как файл был полностью загружен? Я могу ошибаться. И я использую $ .ajax для большинства моих звонков, но я не знаю, как реализовать это с помощью загрузки изображений.
uploadComplete
инициируется, когда файл полностью загружен, PHP-сценарий обработает изображение одновременно с запросом javascript для нового изображения. Это объясняет, почему иногда работают, а иногда не работают. Иногда сценарий PHP сохраняет новое изображение перед его запросом javascript, а иногда сценарий javascript запрашивает новое изображение перед его сохранением в сценарии PHP.
Это происходит из-за кеша изображения, принудительного браузера для получения изображения evrytime. используйте это в uploadcomplete event
var timestamp = new Date();
timestamp = timestamp.getTime();
imageurl+'?t='+timestamp;