我想将多个文件上传到服务器。
据我所知,文件不可写。
我能做什么,以便我的代码可以实际工作并上传文件。
PHP:
if(isset($_FILES ['uploaded_files']))
{
foreach($_FILES['uploaded_files']['name'] as $key=>$value)
{
if(is_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key]) && $_FILES['uploaded_files']['error'][$key] == 0)
{
$filename = $_FILES['uploaded_files']['name'][$key];
if (is_writable($filename)) {
echo 'The file is writable';
} else {
echo 'The file is not writable';
}
if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename))
{
//code
}
else
{
die ('There was a problem uploading the pictures.');
}
}
else
{
die ('There is a problem with the uploading system.');
}
}
}
HTML:
<form enctype="multipart/form-data" action="upload.php" method="POST">
<input type="hidden" id="input_clone_id" name="input_clone_id" value="'.$row['id'].'"/>
<input type="hidden" id="input_clone_var" name="input_clone_var" value="V"/>
<input type="file" name="uploaded_files[]" id="input_clone" multiple="multiple" /><br />
<input type="submit" style="margin-left:0" value="Upload Files" />
</form>
答案 0 :(得分:1)
您正在检查您最近上传但尚未保存的文件是否可写,我认为这样的文件不会是可写的。 最好删除if,或者只检查要上传的文件夹是否可写。
除此之外,我检查了你的代码并且它有效。
答案 1 :(得分:1)
我发现这有两个问题。第一个是安全问题,第二个可能是导致问题的原因
您遇到安全问题:
$filename = $_FILES['uploaded_files']['name'][$key];
...
if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename))
...
问题a:由于$filename
来自$ _FILES数组,因此无法信任。用户告诉您的网站他们的文件名称是什么,并把它放在那里。它们可以为您提供一些虚假的文件名,这些文件可能导致您的脚本以有趣的方式失败。在以任何方式使用之前,您需要清理该文件名。
问题b:通过允许用户指定文件名,他们可能只是通过指定冲突的文件名来覆盖“images / gallery”目录中的其他文件。避免这种情况的方法是使用数据库,为上传的文件生成唯一标识符,以该唯一名称存储文件,并在数据库中保留原始文件名和其他信息的记录。这样你总是知道原始文件名是什么,并且你没有机会试图覆盖该目录中的文件。
写作问题:*
您的“检查可写”声明是错误的。返回的文件名是用户在提交时使用的文件名。这不会指向你的文件系统上的任何一点...它指向他们(有时)你看不到的地方。你需要检查的是你的“../ images/gallery”目录是可写的而不是$filename
。如果失败,您需要在images文件夹中执行“chmod -R 777 gallery”,如果您有命令行访问权限,或者如果您使用FTP与服务器通信,则通过您正在使用的任何FTP客户端进行全局写访问
那么,你应该为那张支票代替的是:
if (is_writable("../images/gallery")) {
echo 'The file is writable';
} else {
echo 'The file is not writable';
}
执行此操作后,如果您的脚本返回并说“文件可写”,则应该能够将文件复制到您的images / gallery文件夹中(请记住不要使用该名称用户提供的文件)。如果没有,也许您没有权限移动上传的文件。
至于上传文件的位置,我认为有时它们会在脚本执行结束后被删除有时,但如果没有,你可以回复文件的'tmp_name'
,如果你去那个目录,你会发现它坐在那里。这只是一个验证测试,以确保文件实际上到达您的服务器。只要您将上传文件移动到的目录上具有写入权限(即chmod 777
所做的),您就应该能够将其复制到那里。