2016-10-19 7 views
-1

Хорошо. У меня есть галерея-приложение, которое я создаю, где у меня есть список миниатюр, и когда вы нажимаете, извлекает исходное изображение с помощью ajax-вызова showfile.php, который просто возвращает файл через header(), используя X-Sendfile , Это работает, но по какой-то причине я не могу получить последующий вызов, чтобы вернуть правильные значения, и скрипт ломается. (First return возвращает «null», что я хочу, а второй возвращает изображение как двоичные данные).PHP - обратное изображение с заголовком («X-sendfile») возвращает null на первой итерации, двоичный на второй (с использованием ajax)

Хорошо. Вот код для 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'}); }; 
       } 
      }) 
     } 
    }) 
    } 
}); 
}); 

Это работает, вплоть до второго АЯКС-вызова - возвращаемое значение из showfile.php на второй вызов не является бинарным блок (если смотреть на NET -tab в консоли, я получаю правильное изображение), но по какой-то причине 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-call работает при первом щелчке, он должен работать и во втором клике, не так ли? Но это не так. Однако, если я закрою изображение и нажму новый миниатюру, все будет хорошо. Не обновляйте страницу или что-то в этом роде, просто закройте всплывающее окно и щелкните новый миниатюру, он снова работает. Но по какой-то причине он не возвращает одно и то же значение «null» при втором щелчке.

Это заставляет меня думать, что есть что-то, что не закрывается или не перезаписывается или что-то еще, и что-то вроде проблемы с «оставшимся» - что приводит меня к php-файлу, так как это то, что, кажется, возвращает разные значения. Есть ли что-нибудь, что я могу сделать, чтобы «обнулить»?

Я пробовал Google, но на самом деле не нашел столько информации об этих функциях.

О, второй ajax-click возвращает, как я уже сказал, некоторую двоичную информацию, но когда я пытаюсь создать объект Url из него, используя blob, он не работает, т. Е. URL-адрес не работает, он просто показывает сломанный значок изображения, а не фактическое изображение, хотя URL-адрес кажется правильным (тот же URL-адрес, что и я снова просматриваю миниатюры и снова нажимаю, начиная с), и, как я уже сказал, net-tab на консоли показывает изображение, являющееся вернулся в обоих случаях.

ответ

0

Хорошо, теперь я чувствую себя невероятно глупо. Это опечатка. datatype должен быть dataType - иногда верблюд-футляр в javascript меня подводит. Изменение этого исправляет проблему.