我写了一个脚本来读取.pdf文件。如果文件名是 document.pdf 之类的东西,一切正常,但是有时我收到带有 document(1).pdf 的文件,脚本失败。 以下是代码
有什么主意吗?
$dir = $_POST['dir'];
$fname = basename( $_FILES['filename']['name']);
$full_fname = $dir.$fname;
$command ='/usr/bin/pdftotext -layout '.$full_fname.' -';
$content = exec($command, $output, $returnvar);
$count = count($output);
if ($count == 0) {die("Sorry but cant open the file. Maybe the filename contains () or unwanted chars");}
答案 0 :(得分:2)
请勿使用$_FILES['filename']['name']
,而只能使用$_FILES['filename']['tmp_name']
。
name
字段包含上传者声明其在本地文件系统上拥有的文件的名称。可以使用该名称(在对输出进行正确的转义后)为用户提供参考。
tmp_name
是一个文件名,上传后,PHP将使用该文件名将其存储在一个临时位置。该文件名是系统随机生成的,没有用户注入。但是请注意,如果以后需要文件,则必须将文件(最好使用move_uploaded_file())复制/移动到永久存储位置(最好在文档根目录之外)。
如果您曾经将数据传递到命令行,请使用escapeshellarg()例如:
$fname_escaped = escapeshellarg($_FILE['filename']['tmp_name']);
$command ='/usr/bin/pdftotext -layout '.$fname_escaped.' -';
(是的,即使是最安全的tmp名称也必须转义,以防止将来可能出现的问题,并简化鳕鱼审查)
在打印给用户时,根据上下文,始终使用htmlentities(),json_encode或类似方法转义数据:
$fname_html = htmlentties($_FILE['filename']['name'], ENT_QUOTES);
echo "Thank you for uploading <i>{$fname_html}</i>.";
这种转义也应该根据外部pdftotext
的图形进行。
将名称存储到数据库时,请使用正确的转义例程或参数绑定。
始终,对于来自程序外部的所有数据。
答案 1 :(得分:0)
使用此正则表达式。假设您的[{'p': 3, 'id': 'ab1'}, {'p': 5, 'id': 'ab3'}, {'p': 8, 'id': 'ab4'}, {'p': 10, 'id': 'ab2'},{'id': 'ab5'}]
看起来像 document(1).pdf (一个空格或更多然后一个空格)将显示为 document_(1).pdf 。< / p>
$fname