【问题标题】:Why I'm not able to upload file using Session in PHP?为什么我无法在 PHP 中使用 Session 上传文件?
【发布时间】:2026-01-22 04:20:03
【问题描述】:

我有一个包含太多字段的表单。这些字段之一如下:

<form action="go_to_preview.php" role="form" method="post" enctype="multipart/form-data">
  <input type="file" name="equip_image" id="equip_image">
</form>

现在go_to_preview.php文件的作用是把用户填写的数据以标签的形式显示出来。所有填写的数据也包含在隐藏字段中。此表单上还有一个提交按钮。如果用户发现他/她填写的内容是完美的,则用户单击文件go_to_preview.php 上的提交按钮。只要用户单击提交按钮,我就会将通过$_POST 收到的数据添加到数据库中。 现在我的问题是我无法上传用户从包含文件控制的页面中选择的文件。除了$_POST(这是一个存在于隐藏字段中的数据数组),我将在会话中发送$_FILES 数组,如下所示:

//go_to_preview.php
session_start();
$_SESSION['FILES'] = $_FILES;

//final.php
session_start();
$files_var = $_SESSION['FILES'];
//use $files_var
unset($_SESSION['FILES']);

到目前为止,一切都很好。现在,当我提交表单时,我必须将所选文件上传到服务器。为此,我在 final.php 文件中编写了以下逻辑:

move_uploaded_file( $_SESSION['FILES']['equip_image'], $target);
unset($_SESSION['FILES']);

函数已正确执行,但文件未上传到服务器。 有人可以在这方面帮助我吗? 提前致谢。 如果你不明白我的疑问,你也可以参考我的以下问题来清楚地了解我的问题: How to get the $_FILES array data as it is after form submission in following scenario?

【问题讨论】:

  • @Flosculus:为了获得清晰的想法,您可以参考我的问题*.com/questions/25752228/…
  • 抱歉,我删除了该评论,因为我忘记了文件数据实际上并未存储在 $_FILES 中。尽管如此,您是否将上传的文件移动到永久位置?因为它只是在创建请求期间是临时的。
  • 澄清一下,您将图像移动到会话中,然后尝试在以后的请求中从同一会话中检索图像?问题是 PHP 会话可能非常短暂,因此您将遭受频繁的数据丢失。如果你想做异步上传,你最好使用队列——比如 PHPResque。如果你不能这样做,那么至少使用一个简单的实现,将图像移动到一个文件夹并将文件夹视为一个队列。
  • 上传文件后取消设置会话。我认为你在上传之前破坏了你的会话。
  • @Flosculus:不,除了 Session 之外,我不会移动或存储任何类型的 $_FILES 数据。

标签: php forms file-upload session-variables


【解决方案1】:

根据您的代码序列,您尝试将上传的文件存储在会话中,然后在 final.php 上使用它们进行处理或显示。您上传的所有文件都放在某个临时文件夹中,您应该在连接关闭之前将其移至某个永久存储中。因为服务器将在您的连接关闭后立即删除临时文件。因此,您应该将上传的文件放入应用程序中的永久空间,例如将具有写入权限的文件夹上传到 Apache,然后您可以在会话中存储指向文件的链接。

【讨论】:

  • +1 我不确定上一个问题的答案是否说明了这一点。
  • 基于他的问题,他希望用户填写表格,但不想在用户在审核后进行最终提交之前存储数据,因此他正在寻找在会话中存储数据,这是不可能的我上面提到的文件。
  • 理想情况下,您应该将几个 DB 表专用于向导进度系统。除非您进行某种清理,否则当会话终止且表单未完成时,文件可能会成为孤立文件。但是,这应该可以解决您丢失文件的问题。
  • @KapilBhagchandani:根据您的建议,如果我在用户首次提交表单时将文件上传并保存到服务器的某个文件夹中,然后如果我修改 $_FILES["file"]["tmp_name "] 值到之前保存到文件夹中的图像位置,然后再次使用 $_FILES 数组上传文件。它会起作用吗?
  • 是的,这可以被视为一种解决方案,您必须自己清理垃圾文件,而无需再次上传,只需从上传文件夹中移动或复制文件即可。我想建议您遵循@Flosculus 建议的方式。