Хорошо. У меня есть приложение-галерея, которое я создаю, где у меня есть список миниатюр, и когда я нажимаю, выбирает исходное изображение с помощью ajax-вызова в showfile.php, который просто возвращает файл через header (), используя X-Sendfile. , Это работает, но по какой-то причине я не могу получить последующий вызов для возврата правильных значений, и сценарий прерывается. (Первое возвращение возвращает «ноль», чего я и хочу, а второе возвращает изображение в виде двоичных данных).
Хорошо.
Вот код для вызова ajax:
$('.lightbox').click(function(e) {
e.preventDefault();
var $this = $(this);
var linkName = $(this).attr('href').split('=')[1];
$.ajax({
url: 'showfile.php',
type: 'GET',
dataType: 'binary',
data: 'file='+linkName+'',
responseType: 'blob',
processData: false,
success: function(result) {
var image = new Image();
image.src = URL.createObjectURL(result);
$('#lightbox_container').append(image).removeClass('hidden').addClass('visible');
image.onload = function() { var imageWidth = image.width/2; $('#lightbox_container').css({'margin-left':'-'+imageWidth+'px'}); window.URL.revokeObjectURL(image.src);};
$('#overlay').removeClass('hidden').addClass('visible');
$('.nextbutton,.prevbutton').click(function(e) {
if ($(e.target).hasClass('prevbutton')) {
var linkName = $this.parent('.pictures').prev('li.pictures').find('a').attr('href').split('=')[1];
$.ajax({
url: 'showfile.php',
type: 'GET',
datatype: 'binary',
data: 'file='+linkName+'',
responseType: 'blob',
processData: false,
success: function(result2) {
var image = new Image();
var binaryData = [];
binaryData.push(result2);
image.src = URL.createObjectURL(new Blob(binaryData));
// image.src = URL.createObjectURL(result2);
$('#lightbox_container img').remove();
$('#lightbox_container').append(image);
image.onload = function() { var imageWidth = image.width/2; $('#lightbox_container').css({'margin-left':'-'+imageWidth+'px'}); };
}
})
}
})
}
});
});
Это работает до второго ajax-вызова — возвращаемое значение из showfile.php при втором вызове является двоичным блоком (если я смотрю на вкладку NET в консоли, я получаю верное изображение), но по какой-то причине createObjectUrl не работает (я пробовал без бинарного двоичного элемента данных, но затем createObjectUrl просто завершается ошибкой, поскольку результат не подходит для использования.
Файл showfile.php выглядит следующим образом:
<?php
require_once('conf/config.php');
if (!session_id()) { session_start(); };
if ($isloggedin) {
if (isset($_GET['file'])) {
// $getFile = readfile($_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'pictures/'.$_GET['file']);
header('Content-type: image/jpeg');
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'pictures/'.$_GET['file'].''); # make sure $file is the full path, not relative
exit;
// echo base64_encode($getFile);
}
}
?>
Есть несколько закомментированных строк, я пытался использовать readfile () вместо этого, не работает лучше, кажется, немного медленнее в целом.
Итак, что мне нужно: что я делаю не так? Поскольку ajax-вызов работает при первом щелчке, он должен работать и при втором щелчке, верно? Но это не так. Однако, если я закрою изображение и нажму на новый эскиз, все будет работать нормально. Не обновляйте страницу или что-то в этом роде, просто закройте всплывающее окно и нажмите на новый эскиз, он снова работает. Но по какой-то причине он не возвращает то же самое «нулевое» значение при втором щелчке.
Это заставляет меня поверить, что есть что-то, что не закрывается, не сбрасывается или что-то в этом роде, и что-то вроде «остаточной» проблемы — что приводит меня к php-файлу, поскольку это то, что, кажется, возвращает разные значения. Могу ли я что-нибудь сделать, чтобы «обнулить»?
Я пробовал поискать в Google, но на самом деле не нашел так много информации об этих функциях.
О, второй щелчок ajax возвращает, как я уже сказал, некоторую двоичную информацию — но когда я пытаюсь создать из него objectUrl, используя blob, он не работает — то есть, URL не работает, он просто показывает значок разбитого изображения, а не фактическое изображение, хотя URL-адрес кажется правильным (тот же URL-адрес, что и при повторном просмотре миниатюр и повторном нажатии, начиная с начала), и, как я уже сказал, на вкладке net в консоли показано изображение, возвращаемое в обоих случаях ,
Хорошо, теперь я чувствую себя невероятно глупо. Это опечатка. datatype
должно быть dataType
— иногда случай с верблюдом в javascript сбивает меня с толку. Изменение, которое решает проблему.
Других решений пока нет …