【问题标题】:move_uploaded_file not working after preview pagemove_uploaded_file 在预览页面后不起作用
【发布时间】:2012-06-05 14:20:49
【问题描述】:

我将表单提交到预览页面(表单),然后最终提交。我无法让 move_uploaded_file 工作。我该如何解决这个问题?当我检查目录时,那里没有文件。

预览页面

      $tmpname = $_FILES['titleimage']['tmp_name'];
            $imagefile = $_FILES['titleimage']['name'];
          $filename = basename($imagefile);
           $imagename = dirname(__FILE__).'/avatar/'.$filename; 

            echo "<form enctype='multipart/form-data' id='submitpreview' action='/upload' method='POST'>
<input type='hidden'  name='image' value='$tmpname' readonly />
    <input type='hidden'  name='imagedir' value='$imagename' readonly />";
                        //other code
                echo "<div id='preview-submit-button'><a>Submit</a></div>
                </form>";

上传页面

$image = $_POST['image'];
$directory = $_POST['imagedir'];

move_uploaded_file($image,$directory);

【问题讨论】:

  • “我无法让 move_uploaded_file 正常工作”是什么意思?
  • 文件应该上传到目录,但我提交表单后没有文件。
  • 第一次提交后,文件被删除。更确切地说,当第一次请求完成时,文件被删除。这是设计使然。
  • 这就是我的想法,是否可以保存临时文件并删除?是怎么回事?饼干?
  • 只需将其复制到您想要的任何位置,以后可以移动/删除它

标签: php


【解决方案1】:

您确定提交第二个表单后临时文件$_FILES['titleimage']['tmp_name'] 还在吗?请记住,这是一个临时文件。恐怕它存在仅在第一个表单提交时(直到请求被处理)。

所以,你应该:

  1. 尽快(也就是说,在接收第一个表单的页面中,实际上是您的预览页面)您使用 move_uploaded_file() 将临时文件保存在您的文件夹中.

  2. 如果用户确认预览,您将文件从您在步骤1中保存它的目录移动到它的定义 文件夹,使用 rename() 函数。

  3. 如果用户不确认预览,您可以使用unlink()函数将其删除。


另外,正如 Marc B 所指出的,您应该看看 preview-save 逻辑的安全性。在隐藏的表单字段中传递路径和文件名是帮助黑客破坏您的系统的好方法。查看 PHP Sessions(也许您已经知道),并考虑将这些路径从公共表单移至会话变量。

【讨论】:

  • 谢谢,如果临时文件夹或最终文件夹中有重复的文件名怎么办?有没有办法为文件添加唯一标识符?
  • 我正在使用一个函数来检查具有该名称的文件是否已经存在,如果不存在则返回相同的文件名,或者后缀不存在的文件名是。例如,如果 a.png 存在,则返回 a_2.png,否则返回 a.png。尝试制作自己的。如果您对如何做到这一点有疑问,请在此处提出另一个问题,现在已经跑题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2018-07-06
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多