读取带有空格和()的文件名

时间:2019-04-30 09:48:42

标签: php

我写了一个脚本来读取.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");} 

2 个答案:

答案 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