Javascript php://stdin 读取额外字符

Javascript php://stdin 读取额外字符,javascript,php,jquery,http-put,Javascript,Php,Jquery,Http Put,我正在制作的系统有一个奇怪的问题。我正在尝试创建一个将文件上载到服务器的系统。我没有直接文件写入权限,HTTP POSTmultipart/form data文件上传不起作用。很遗憾,我无法直接访问服务器 我的解决方案是使用jQuery的$.ajax函数通过HTTP PUT上传文件,然后从服务器上的PHP中的STDIN读取它,然后通过FTP将内容上传到不同的位置 一切似乎都正常,但在这条线路的某个地方,额外的字节正在被添加。在客户端,Windows声称该文件(我正在使用我的网站的favicon.

我正在制作的系统有一个奇怪的问题。我正在尝试创建一个将文件上载到服务器的系统。我没有直接文件写入权限,HTTP POST
multipart/form data
文件上传不起作用。很遗憾,我无法直接访问服务器

我的解决方案是使用jQuery的
$.ajax
函数通过HTTP PUT上传文件,然后从服务器上的PHP中的STDIN读取它,然后通过FTP将内容上传到不同的位置

一切似乎都正常,但在这条线路的某个地方,额外的字节正在被添加。在客户端,Windows声称该文件(我正在使用我的网站的
favicon.ico
文件进行测试)为7358字节。一旦我使用标准Javascript FileReader对象读入文件,它看起来只有7311字节。然后,我成功地将它放到服务器上的一个PHP脚本中,该脚本声称它读取了10890字节,当我通过FTP检查转储文件夹时,FileZilla同意这一点

下面是我要上传的Javascript代码(包括jQuery 1.11.3,并且
文件\u输入

如您所见,名称和MIME类型通过GET查询字符串包含

下面是我的PHP,它接受上传(upload.PHP的一部分):

我检查了记事本中的文件,大部分文件似乎没有改变(没有任何HTTP头或任何东西),但是新文件拒绝在任何图像查看器中打开(原始文件会).根据文件中的差异-只有一些部分是更改的,它们被更改为看似随机的非视觉字符-我猜这与字符编码差异有关。任何想法都将不胜感激

谢谢

魔法18

编辑

我的服务器是Apache/2.4.6,运行在x86_64-redhat-linux-gnu上(根据phpinfo())

另外,我用一个基于文本的文件(一个PHP脚本)对它进行了测试,它工作得很好——这一定与文件的二进制内容有关。

对于二进制文件(即非文本),您可以尝试在
fopen
的标志中添加
b

fopen("php://input","rb");
/*
...
*/
$ftp=fopen('ftp://user:pass@example.com/admin/fs/upload/'.uniqid('',true),'wb');
编辑

除了接收流之外,您还必须以二进制格式发送文件。请参阅注释中的链接。

这不起作用。如果您查看for fopen,它没有被列为官方支持的模式;不过感谢您的想法。我将在问题中添加我的服务器描述。是的,如果您在工作时没有指定“b”标志,我会阅读该
g使用二进制文件时,您可能会遇到数据方面的奇怪问题,然后冒险。谢谢您,使用XHR和原始
文件
对象而不是jQuery有效。请将此作为答案发布,我会将其标记为已接受。感谢您的帮助。感谢您的礼貌。随时都德。
if(strtoupper($_SERVER['REQUEST_METHOD'])=="PUT"){
    echo "uploading\n";
    echo "connected\n";
    var_dump($_POST);
    echo "x";
    $file=fopen("php://input","r");
    var_dump($file);
    $x="";
    while($byte=fgetc($file)!==false){
        $x.=$byte;
    }
    echo strlen($x);
    echo "\n";
    $ftp=fopen('ftp://user:pass@example.com/admin/fs/upload/'.uniqid('',true),'w');
    var_dump($ftp);
    fwrite($ftp,$x);
    fclose($ftp);
    echo "done\n";
}
fopen("php://input","rb");
/*
...
*/
$ftp=fopen('ftp://user:pass@example.com/admin/fs/upload/'.uniqid('',true),'wb');