Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-返回带有标题的图像(“X-sendfile”)在第一次迭代时返回null,在第二次迭代时返回二进制(使用ajax)_Php_Jquery_Ajax_Binary_X Sendfile - Fatal编程技术网

PHP-返回带有标题的图像(“X-sendfile”)在第一次迭代时返回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();

好的。我正在构建一个gallery应用程序,其中有一个缩略图列表,单击时,通过ajax调用showfile.php获取原始图像,showfile.php使用X-Sendfile通过header()返回文件。这是可行的,但由于某些原因,我无法获得后续调用以返回正确的值,脚本中断。(第一个返回“null”,这是我想要的,而第二个返回作为二进制数据的图像)

好的。 下面是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调用在第一次单击时有效,所以在第二次单击时也应该有效,对吗?但是它不会。但是,如果我关闭图像,然后单击一个新的缩略图,它就可以正常工作。不刷新页面或类似的内容,只需关闭弹出窗口,然后单击一个新的缩略图,它就可以再次工作。但是由于某些原因,它在第二次单击时不会返回相同的“null”值

这让我相信有些东西没有被关闭或重置,还有一些“遗留”问题——这让我想到php文件,因为这似乎返回了不同的值。我能做些什么来“归零”吗

我尝试过谷歌搜索,但根本没有找到关于这些函数的那么多信息


哦,正如我所说,第二次ajax单击返回一些二进制信息——但是当我尝试使用blob从中创建objectUrl时,它不起作用——即,url不起作用,它只显示一个损坏的图像图标,而不是实际的图像,尽管url看起来是正确的(相同的url,就像我再次访问缩略图并再次单击一样,从头开始),正如我所说,console中的net选项卡显示了在这两种情况下返回的图像。

好吧,我现在感到难以置信的愚蠢。这是一个输入错误。
数据类型应该是
数据类型
-有时候javascript中的驼峰型会让我不知所措。这样做可以解决问题