好的。我有一個正在構建的畫廊應用程序,我有一個縮略圖列表,點擊時,通過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似乎是正確的(相同的網址,如果我再次訪問縮略圖,再次點擊,重新開始),正如我所說,控制檯中的網絡選項卡顯示圖像在兩種情況下都返回。