PHP-返回带有标题的图像(“X-sendfile”)在第一次迭代时返回null,在第二次迭代时返回二进制(使用ajax)
好的。我正在构建一个gallery应用程序,其中有一个缩略图列表,单击时,通过ajax调用showfile.php获取原始图像,showfile.php使用X-Sendfile通过header()返回文件。这是可行的,但由于某些原因,我无法获得后续调用以返回正确的值,脚本中断。(第一个返回“null”,这是我想要的,而第二个返回作为二进制数据的图像) 好的。 下面是ajax调用的代码:PHP-返回带有标题的图像(“X-sendfile”)在第一次迭代时返回null,在第二次迭代时返回二进制(使用ajax),php,jquery,ajax,binary,x-sendfile,Php,Jquery,Ajax,Binary,X Sendfile,好的。我正在构建一个gallery应用程序,其中有一个缩略图列表,单击时,通过ajax调用showfile.php获取原始图像,showfile.php使用X-Sendfile通过header()返回文件。这是可行的,但由于某些原因,我无法获得后续调用以返回正确的值,脚本中断。(第一个返回“null”,这是我想要的,而第二个返回作为二进制数据的图像) 好的。 下面是ajax调用的代码: $('.lightbox').click(function(e) { e.preventDefault();
$('.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调用在第一次单击时有效,所以在第二次单击时也应该有效,对吗?但是它不会。但是,如果我关闭图像,然后单击一个新的缩略图,它就可以正常工作。不刷新页面或类似的内容,只需关闭弹出窗口,然后单击一个新的缩略图,它就可以再次工作。但是由于某些原因,它在第二次单击时不会返回相同的“null”值
这让我相信有些东西没有被关闭或重置,还有一些“遗留”问题——这让我想到php文件,因为这似乎返回了不同的值。我能做些什么来“归零”吗
我尝试过谷歌搜索,但根本没有找到关于这些函数的那么多信息
哦,正如我所说,第二次ajax单击返回一些二进制信息——但是当我尝试使用blob从中创建objectUrl时,它不起作用——即,url不起作用,它只显示一个损坏的图像图标,而不是实际的图像,尽管url看起来是正确的(相同的url,就像我再次访问缩略图并再次单击一样,从头开始),正如我所说,console中的net选项卡显示了在这两种情况下返回的图像。好吧,我现在感到难以置信的愚蠢。这是一个输入错误。
数据类型应该是数据类型
-有时候javascript中的驼峰型会让我不知所措。这样做可以解决问题