- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作的系统遇到了一个奇怪的问题。我正在尝试创建一个将文件上传到服务器的系统。我没有直接文件写入权限,并且 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/
我有以下代码可以完全按预期工作: from subprocess import Popen process = Popen( ["/bin/bash"], stdin=sys.stdi
我有一个关于 php-cli 的新问题。 我正在使用这个: define("STDIN", fopen('php://stdin','r')); $input = ""; while($input =
这个问题在这里已经有了答案: Can fseek(stdin,1,SEEK_SET) or rewind(stdin) be used to flush the input buffer inste
我正在编写一个 python 程序,它将所有输入都大写(替代非工作 tr '[:lowers:]' '[:upper:]')。语言环境是 ru_RU.UTF-8,我使用 PYTHONIOENCODIN
自从我发现 fflush(stdin) 不是处理熟悉的“换行潜伏在输入缓冲区中”问题的可移植方法,我一直在使用当我必须使用scanf时如下: while((c = getchar()) != '\n'
当我使用时在 Perl 模块( *.pm )文件中,它不会从键盘读取输入,但是当我使用 时在同一个地方它工作得很好。 为什么我使用时没有得到输入? 最佳答案 STDIN 是记录的文件句柄。还有 st
stdin 是否是一个指针,正如我在 fgets() 中看到的那样。 我使用“0”作为标准输入的读取或写入错误,并在 fgets 期间出现段错误。 STDIN宏和0是否相同。 stdin 是文件指针吗
我想知道 STDIN 和 $stdin 之间是否有任何真正的区别。我在 irb: STDIN == $stdin 并返回 true。它们只是同一事物的两个名称吗?还是有什么不同? 最佳答案 来自 Ru
有没有一种简单的方法可以将内容通过管道传输到编辑器原子? 例如: echo "Content." | atom 不幸的是atom没有获取到内容。当前版本的 gedit 具有参数 - 以启用读取 STD
这个问题已经有答案了: Using fflush(stdin) (7 个回答) 已关闭 9 年前。 我有一个这样的测试代码 #include #include #include int main
我有一个 bash启动 scp 的脚本通过以下方式: echo "${SCP_PASS:-$PASSWORD}" | ( exec 3<&0; scp -qp ${SCP_PORT:+-P$SCP_P
我正在创建一个 NASM 汇编代码来从标准输入读取文件中存在的二维数字数组我正在运行这样的可执行文件 -> ./abc < input.txt . 之后,我将在终端上显示读取的二维数组,然后我想获取箭
这是一个循环,它重复地从 stdin 获取两个字符并输出它们。 char buf[2]; while (1) { printf("give me two characters: ");
我有一个 golang 程序,可以为 jq 做一个简单的 repl。 .我希望能够在程序启动时从 stdin 读取输入到一个临时文件中,这样我就可以将 repl 与管道输入一起使用。 cat file
有没有非阻塞的 PHP 从 STDIN 读取: 我试过了: stream_set_blocking(STDIN, false); echo fread(STDIN, 1); 还有这个: $stdin
这实际上与我已经回答的另一个问题有关。这个问题在这里:Redirecting stdout of one process object to stdin of another 我的问题是(我认为)获取
我只是一个java初学者,目前正在大学学习,但由于某些原因我不会深入,我无法询问我的导师。 我在 Netbeans 中使用 StdIn 库时遇到问题。在类里面我们使用 DrJava,但由于我无法让它在
Ruby 有两种引用标准输入的方法:STDIN 常量和$stdin 全局变量。 除了我可以将不同的 IO 对象分配给 $stdin 因为它不是常量(例如,在我的 child 中 fork 重定向 IO
我是 Pythonizer 的作者我正在尝试将 CGI.pm 的代码从标准 perl 库转换为 Python。我在 read_from_client 中看到这段代码: read(\*STDIN, $$
我正在使用 laravel 5.6 并遇到问题,当我在控制台中使用命令“php artisan vendor:publish”时,出现以下错误: [ERROR] Use of undefined co
我是一名优秀的程序员,十分优秀!