【问题标题】:Storing FILE data in a session for later use move_uploaded_file将 FILE 数据存储在会话中以供以后使用 move_uploaded_file
【发布时间】:2017-12-19 05:47:59
【问题描述】:

我不知道这是否可行,但我需要将 FILE 数据存储到会话中,以便将来使用其信息将图像存储到服务器中。

目前拖放正在将数据直接存储到服务器。

基本上我有一个表单,用户可以在其中填写产品信息,然后添加图像。一旦用户输入所需的信息并按下提交,这些信息将被存储到创建产品 ID 的 mysql 中。使用该产品密钥,我将使用它来命名图像,例如 product_ID + product_namme + image number.jpg 问题是到目前为止我找不到存储文件数据的方法,我已经尝试过使用会话,但是当我回显它的值时,它的值是空白的。

PHP 此版本有效,但直接存储数据,因此我无法重命名文件。这发生在之前

foreach($_FILES['file']['name'] as $position => $name){
    if(move_uploaded_file($_FILES['file']['tmp_name'][$position], '../ProductImages/'.$name));
}

这是其中包含会话的代码,但是当我在用户按下提交后回显这些会话时,它们是空白的。如果我在此代码下方回显,它将有数据。我有什么遗漏吗?

if(!empty($_FILES['file']['name'][0])){
    $_SESSION['imgAmount'] = 1;
    foreach($_FILES['file']['name'] as $position){
        $_SESSION['tmpVal'][$position] = $_FILES['file']['tmp_name'][$position];
        $_SESSION['imgAmount']++;
    }
}

这就是所谓的视野

$i = 0;
 if(isset($_SESSION['tmpVal'])){
        while($i < $_SESSION['imgAmount']){
            move_uploaded_file($_SESSION['tmpVal'][$i],'../ProductImages/'.$imgID . 'child' . $i . '.jpg');
            $i++;
            echo "test0";
            echo "<br>" . $_SESSION ['tmpVal'];
            echo "<br>" . $_SESSION ['imgAmount'];
            echo "<br>" . $_SESSION ['tmpVal'][0];
            echo "<br>" . $_SESSION ['tmpVal'][1];

        }
    }

【问题讨论】:

  • 该数组中的信息仅供临时使用。将它存储在会话中绝对没有意义。将您需要的那些方面保存到数据库中,将临时文件移动到最终目的地。为此,您应该使用客户端提供的文件名!那是安全漏洞!而是按照您自己绘制的方法生成一个内部文件名。只需将调用中连接目标路径的方式更改为move_uploaded_file()
  • 你做错了。使拖放 not 自动上传文件并将其与其余信息一起发布 + 前面的评论所说的安全性。如果文件很大,在用户提交表单时,上传甚至可能都没有完成。
  • 我考虑将它作为临时文件移到数据库中,一旦我将用户的所有其他信息存储到数据库中,获取 product_ID 并再次将其与实际产品数据一起存储。但是我虽然在数据库上存储临时数据并没有那么高效,因为我必须不断传输数据,这不会减慢连接速度吗?
  • 关于客户端文件名是的,我知道我只是为了举例目的而保留在那里,这不是最终的工作。
  • 如何将它一起发布需要他们上传图像?发布表单后,将信息存储在您的数据库中,获取 ID,如果帖子包含图像,则处理上传。如果没有,不用担心......

标签: php mysql session


【解决方案1】:

您不能将文件存储到会话中并在以后使用它们

我在我的 1 个项目中实现了以下代码,其中我将文件保存到 1 个位置,然后在满足条件的情况下,我将它们复制到实际目标位置并从临时位置删除

//Initial storing
for ($i = 0; $i < count($_FILES['files']['name']); $i++)
        {
            if ($_FILES['files']['error'][ $i ] == 0)
            {
                $tmpName = $_FILES['files']['tmp_name'][ $i ];
                $name = $_FILES['files']['name'][ $i ];
                $location = "temp/";

                move_uploaded_file($tmpName, $location . $name);
            }
        }
session(['filesList' => $_FILES]);

//Final moving to the actual target location

$fileList = session('filesList');
if (count($fileList['files']['name']) > 0)
        {
            for ($i = 0; $i < count($fileList['files']['name']); $i++)
            {
                if ($fileList['files']['error'][ $i ] == 0)
                {
                    $name = $fileList['files']['name'][ $i ];

                    $transferFile = "temp/" . $name;

                    $location[] = "files/" . $userId . $name;

                    copy($transferFile, $location[ $i ]);
                    unlink('temp/' . $name);
                }
            }
        }

所以基本上除了 laravel 中的会话代码之外,您也可以使用核心 PHP 中的其余代码

希望对你有帮助

【讨论】:

  • 函数session()在哪里定义?
  • 这是 laravel 定义会话的方式,但是你可以使用 $_SESSION 代替它
猜你喜欢
  • 2017-05-28
  • 2019-01-19
  • 1970-01-01
  • 2020-09-21
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多