在PHP中,如何打开名称中包含特殊字符的文件?
该名称类似于iPad | -5542fa5501f31.log
另一个论坛,我试过了:
$logid = str_replace(" ", "\x20", $_GET['logid']);
$logid = str_replace("|", "\x7C", $logid);
按摩这个名字,但这对我来说也不起作用。
我也已尝试过:
$dst_file = escapeshellarg($dst_file);
当然,只是直接开始:
$logid = $_GET['logid'];
初始文件是由Linux系统上的PHP脚本创建的。我很困惑为什么PHP脚本可以编写这样的文件名,但无法打开它进行阅读。
这是我目前的代码:
$logid = str_replace(" ", "\x20", $_GET['logid']);
$logid = str_replace("|", "\x7C", $logid);
$logdate = str_replace("-", "/", $_GET['date'])."/";
$dst_file = $uploads_dir.$logdate.$logid.'.log';
// read the data from the log file
echo "<pre>\n";
if (file_exists($dst_file)) {
$file_handle = fopen($dst_file, "r");
while (!feof($file_handle)) {
$line = fgets($file_handle);
if (strlen($line) < 3) continue;
echo $line;
}
fclose($file_handle);
} else {
echo $dst_file." does not exist\n";
}
echo "</pre>\n";
答案 0 :(得分:0)
我发现的唯一一件事就是重命名文件然后打开。问题是没有PHP函数所以我尝试了系统命令。没有用。 #[derive(Debug,Copy,Clone,PartialEq)]
enum Error {
StartNotFound,
NotANumber,
}
fn parse_it(haystack: &str) -> Result<u8, Error> {
let needle = "HTTP/1.";
let pt = try!(haystack.rfind(needle).ok_or(Error::StartNotFound));
let after_match = &haystack[(pt + needle.len())..];
let val = after_match.splitn(2, " ").next().unwrap();
val.parse().map_err(|_| Error::NotANumber)
}
fn main() {
println!("{:?}", parse_it("HTTP/1.1 200\r\n"));
println!("{:?}", parse_it("HTTP/1"));
println!("{:?}", parse_it("HTTP/1.cow"));
}
命令将重命名它。但过滤掉特殊字符&#34;会更好。保存文件时。
答案 1 :(得分:0)
另一个论坛上有人建议使用popen,所以我尝试了这个,并且它有效:
$logid = $_GET['logid'];
$logdate = str_replace("-", "/", $_GET['date'])."/";
$dst_file = escapeshellarg($uploads_dir.$logdate.$logid.'.log');
echo "<pre>\n";
$handle = popen("cat ".$dst_file, 'r');
while(!feof($handle)) {
$line = fgets($handle);
if (strlen($line) > 3) {
echo $line;
}
ob_flush();
flush();
}
pclose($handle);
echo "</pre>\n";
除了使用fopen / fclose(没有cat)之外,完全相同的代码将不起作用。
答案 2 :(得分:0)
我正在努力打开文件“2017-09-19_Comisión_Ambiental.jpg”,因为“ó”给了我这个错误:
file_get_contents ...无法打开流:...中没有这样的文件或目录
所以我在文件名上使用了 utf8_decode ,并且有效:
$data = file_get_contents( utf8_decode( $filename ) );
我知道这是一个古老的问题,甚至有一个公认的答案,我刚刚发布了它,因为它可能会对某人有所帮助。