gpt4 book ai didi

javascript - php://stdin 读取额外字符

转载 作者:行者123 更新时间:2023-12-01 05:41:26 25 4
gpt4 key购买 nike

我正在制作的系统遇到了一个奇怪的问题。我正在尝试创建一个将文件上传到服务器的系统。我没有直接文件写入权限,并且 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,file_input<input type="file" id="file_input"/> :

function upload(){
console.log("upload");
var f = file_input.files[0];
var r = new FileReader();
r.onload = function(event){
var d = r.result;
console.log("data loaded");
console.log(d.length);
$.ajax({
url: "upload.php?name="+encodeURIComponent(f.name)+"&mime="+encodeURIComponent(f.mime),
context: document.body,
method: "PUT",
contentType: "application/octet-stream",
data: d
}).done(function(data){
console.log("done");
console.log(data);
});
};
r.onerror = function(event){
alert("ERROR READING FILE!\nCode " + event.target.error.code);
};
r.readAsText(f);
console.log("initiated");
}

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

这是我接受上传的 PHP(upload.php 的一部分):

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";
}

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

谢谢

MagikM18

编辑

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

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

最佳答案

对于二进制文件(即不是文本),您可以尝试将 b 附加到 fopen 的标志:

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

编辑

<小时/>

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

关于javascript - php://stdin 读取额外字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com