【问题标题】:Get Ajax Header Information in PHP在 PHP 中获取 Ajax 标头信息
【发布时间】:2016-11-29 08:40:32
【问题描述】:

我正在制作一个用于上传文件(视频或图像)的 ajax 函数,如下所示:

function upload_file(file)
     {
        //create xhr object
        xhr = new XMLHttpRequest();

        //initiate request
        xhr.open('post','hisoka_drop.php',true);//true for asynchronous

        //set headers
        xhr.setRequestHeader('Content-Type',"multipart/form-data");
        xhr.setRequestHeader('X-File-Name',file.fileName);
        xhr.setRequestHeader('X-File-Size',file.fileSize);
        xhr.setRequestHeader('X-File-Type',file.fileType);

        //send the file
        xhr.send(file);

     }

在我的 hisoka_drop.php 中:

<?php
    $str =file_get_contents('php://input');
    $filename = ; //How to get ajax header about file.fileName;
    $path = 'upload/'.$filename;
    file_put_contents($path,$str);
    echo $path;
    ?>

我的问题很简单,如何获取我之前设置的 ajax 标头,以便获取要上传到服务器的文件的真实文件名... 在此先感谢... :)

注意: 我试图列出 $_SERVER 中的所有标题,如下所示:

Key ==>MIBDIRS
 Value ==>C:/xampp/php/extras/mibs
 Key ==>MYSQL_HOME
 Value ==>\xampp\mysql\bin
 Key ==>OPENSSL_CONF
 Value ==>C:/xampp/apache/bin/openssl.cnf
 Key ==>PHP_PEAR_SYSCONF_DIR
 Value ==>\xampp\php
 Key ==>PHPRC
 Value ==>\xampp\php
 Key ==>TMP
 Value ==>\xampp\tmp
 Key ==>HTTP_HOST
 Value ==>localhost:8080
 Key ==>HTTP_CONNECTION
 Value ==>keep-alive
 Key ==>CONTENT_LENGTH
 Value ==>305658
 Key ==>HTTP_ORIGIN
 Value ==>http://localhost:8080
 Key ==>HTTP_USER_AGENT
 Value ==>Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
 Key ==>CONTENT_TYPE
 Value ==>multipart/form-data
 Key ==>HTTP_ACCEPT
 Value ==>*/*
 Key ==>HTTP_DNT
 Value ==>1
 Key ==>HTTP_REFERER
 Value ==>http://localhost:8080/task3/
 Key ==>HTTP_ACCEPT_ENCODING
 Value ==>gzip, deflate
 Key ==>HTTP_ACCEPT_LANGUAGE
 Value ==>en-US,en;q=0.8,id;q=0.6
 Key ==>HTTP_COOKIE
 Value ==>PHPSESSID=crk3e9v9m4ri6k2nn8snhihu67
 Key ==>PATH
 Value ==>C:\Python33\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files (x86)\Skype\Phone\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\nodejs\;C:\xampp\php;C:\ProgramData\ComposerSetup\bin;
 Key ==>SystemRoot
 Value ==>C:\Windows
 Key ==>COMSPEC
 Value ==>C:\Windows\system32\cmd.exe
 Key ==>PATHEXT
 Value ==>.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
 Key ==>WINDIR
 Value ==>C:\Windows
 Key ==>SERVER_SIGNATURE
 Value ==><address>Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.5.24 Server at localhost Port 8080</address>

 Key ==>SERVER_SOFTWARE
 Value ==>Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.5.24
 Key ==>SERVER_NAME
 Value ==>localhost
 Key ==>SERVER_ADDR
 Value ==>::1
 Key ==>SERVER_PORT
 Value ==>8080
 Key ==>REMOTE_ADDR
 Value ==>::1
 Key ==>DOCUMENT_ROOT
 Value ==>C:/xampp/htdocs
 Key ==>REQUEST_SCHEME
 Value ==>http
 Key ==>CONTEXT_PREFIX
 Value ==>
 Key ==>CONTEXT_DOCUMENT_ROOT
 Value ==>C:/xampp/htdocs
 Key ==>SERVER_ADMIN
 Value ==>postmaster@localhost
 Key ==>SCRIPT_FILENAME
 Value ==>C:/xampp/htdocs/task3/hisoka_drop.php
 Key ==>REMOTE_PORT
 Value ==>60706
 Key ==>GATEWAY_INTERFACE
 Value ==>CGI/1.1
 Key ==>SERVER_PROTOCOL
 Value ==>HTTP/1.1
 Key ==>REQUEST_METHOD
 Value ==>POST
 Key ==>QUERY_STRING
 Value ==>
 Key ==>REQUEST_URI
 Value ==>/task3/hisoka_drop.php
 Key ==>SCRIPT_NAME
 Value ==>/task3/hisoka_drop.php
 Key ==>PHP_SELF
 Value ==>/task3/hisoka_drop.php
 Key ==>REQUEST_TIME_FLOAT
 Value ==>1469489572.122
 Key ==>REQUEST_TIME
 Value ==>1469489572
 Key ==>REQUEST_TIME

从这个列表中,我找不到任何已发送的标头,例如 FILE_NAME、FILE_SIZE 和 FILE_TYPE,所以这里有什么问题...?? 再次提前感谢..

【问题讨论】:

  • 有更简单的方法来转储数组的内容:var_export($_SERVER) or var_dump($_SERVER) or print_r($_SERVER); =)

标签: php jquery ajax


【解决方案1】:

此外,从 5.4.0 开始,您可以使用 apache_request_headers()。它将当前请求中的所有 HTTP 请求头作为数组返回。

在早期版本中,此功能仅在 PHP 作为 apache 模块安装时才有效。

用法如下所示:

$headers = apache_request_headers();
echo $headers['X-File-Name'];

【讨论】:

  • 听起来很有趣,但是我如何获得一个特定的标题 Mr. Spirit...? :)
  • 像这样:$headers = apache_request_headers(); echo $headers['X-File-Name'];
  • 非常感谢,我终于得到了我漂亮的标题.... :) 我稍后会给出我自己的答案... :)
【解决方案2】:

由于调用了您的自定义 HTTP 标头 X-File-Name,因此只需将其大写,将破折号转换为下划线,并在前面添加 HTTP_ 以形成您将用于在 $_SERVER 超全局中找到它的键。例如:

$filename = $_SERVER['HTTP_X_FILE_NAME'];

有关详细信息,请参阅this answer

【讨论】:

  • 非常感谢 Asaph 先生... :)
  • 我已经更新了我的问题,Asaph 先生,似乎 $_SERVER 没有带来我之前发送的任何标头..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多