PHP - return 图像 header("X-sendfile") returns 在第一次迭代时为空,在第二次迭代时为二进制(使用 ajax)
PHP - return image with header("X-sendfile") returns null on first iteration, binary on second (using ajax)
好的。我有一个正在构建的 gallery-app,其中有一个缩略图列表,单击时,通过 ajax-call 将原始图像提取到 showfile.php,而 return使用 X-Sendfile 通过 header() 发送文件。这有效,但由于某种原因,我无法获得对 return 正确值的后续调用,并且脚本中断。 (第一个 return returns "null",这是我想要的,而第二个 returns 图像作为二进制数据)。
好的。
这是 ajax-call:
的代码
$('.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-call - 第二次调用 showfile.php 的 return 值是一个二进制块(如果我查看 NET-tab在控制台中,我得到了正确的图像 returned),但由于某种原因 createObjectUrl 不起作用(我试过没有 binaryData-bit,但随后 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 在第一次点击时有效,它应该在第二次点击时也有效,对吧?但事实并非如此。但是,如果我关闭图像并单击一个新的缩略图,它就可以正常工作。没有刷新页面或类似的东西,只需关闭弹出窗口,然后单击一个新的缩略图,它又可以工作了。但出于某种原因,第二次点击时 return 的值与 "null" 不同。
这让我相信有些东西没有被关闭或重置或其他什么,以及某种 "left over" 问题 - 这让我想到了 php-file,因为这似乎是return 不同的值。 "zero out" 有什么我可以做的吗?
我试过谷歌搜索,但根本没有找到太多关于这些函数的信息。
哦,第二个 ajax-click returns,正如我所说,一些二进制信息 - 但是当我尝试使用 blob 从它创建 objectUrl 时,它不起作用 - 即,url 不起作用,它只显示损坏的图像图标,而不是实际图像,尽管 url 看起来是正确的(与 url 相同,就好像我重新访问缩略图并再次单击,重新开始),正如我所说,控制台中的 net-tab 显示图像在两种情况下都被 returned。
好吧,我现在觉得自己非常愚蠢。这是一个错字。 datatype
应该是 dataType
- 有时 javascript 中的驼峰式大小写会把我绊倒。更改它可以解决问题。
好的。我有一个正在构建的 gallery-app,其中有一个缩略图列表,单击时,通过 ajax-call 将原始图像提取到 showfile.php,而 return使用 X-Sendfile 通过 header() 发送文件。这有效,但由于某种原因,我无法获得对 return 正确值的后续调用,并且脚本中断。 (第一个 return returns "null",这是我想要的,而第二个 returns 图像作为二进制数据)。
好的。 这是 ajax-call:
的代码$('.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-call - 第二次调用 showfile.php 的 return 值是一个二进制块(如果我查看 NET-tab在控制台中,我得到了正确的图像 returned),但由于某种原因 createObjectUrl 不起作用(我试过没有 binaryData-bit,但随后 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 在第一次点击时有效,它应该在第二次点击时也有效,对吧?但事实并非如此。但是,如果我关闭图像并单击一个新的缩略图,它就可以正常工作。没有刷新页面或类似的东西,只需关闭弹出窗口,然后单击一个新的缩略图,它又可以工作了。但出于某种原因,第二次点击时 return 的值与 "null" 不同。
这让我相信有些东西没有被关闭或重置或其他什么,以及某种 "left over" 问题 - 这让我想到了 php-file,因为这似乎是return 不同的值。 "zero out" 有什么我可以做的吗?
我试过谷歌搜索,但根本没有找到太多关于这些函数的信息。
哦,第二个 ajax-click returns,正如我所说,一些二进制信息 - 但是当我尝试使用 blob 从它创建 objectUrl 时,它不起作用 - 即,url 不起作用,它只显示损坏的图像图标,而不是实际图像,尽管 url 看起来是正确的(与 url 相同,就好像我重新访问缩略图并再次单击,重新开始),正如我所说,控制台中的 net-tab 显示图像在两种情况下都被 returned。
好吧,我现在觉得自己非常愚蠢。这是一个错字。 datatype
应该是 dataType
- 有时 javascript 中的驼峰式大小写会把我绊倒。更改它可以解决问题。