2016-10-19 142 views
-1

好的。我有一個正在構建的畫廊應用程序,我有一個縮略圖列表,點擊時,通過ajax調用獲取原始圖像到showfile.php,它只是使用X-Sendfile通過header()返回文件。這有效,但由於某種原因,我無法獲得後續調用以返回正確的值,並且腳本中斷。 (第一次返回返回「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'}); }; 
       } 
      }) 
     } 
    }) 
    } 
}); 
}); 

這工作,直到第二AJAX調用 - 從showfile.php第二調用的返回值是一個二進制塊(如果我看NET在控制檯中,我得到正確的圖像返回),但出於某種原因,createObjectUrl不起作用(我已經嘗試沒有binaryData位,但然後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似乎是正確的(相同的網址,如果我再次訪問縮略圖,再次點擊,重新開始),正如我所說,控制檯中的網絡選項卡顯示圖像在兩種情況下都返回。

回答

0

好吧,我現在覺得非常愚蠢。這是一個錯字。 datatype應該是dataType - 有時在javascript中的駱駝案件讓我起來。改變它可以解決問題。