【问题标题】:How to store files temporarily using Laravel?如何使用 Laravel 临时存储文件?
【发布时间】:2016-10-04 10:48:03
【问题描述】:

使用Laravel 5.2,我正在制作一个上传表单,该表单应该允许用户选择最多 10 张图像,显示他们的预览,然后让他对它们进行排序,添加更多图像或删除他不想要的图像上传。

预览的排序和删除可以很容易地使用 javascript 完成,但除此之外,我很难弄清楚如何正确地完成其余的工作。我最初的想法是从输入中获取 js 文件数组,将其移动到另一个数组并在用户与图像预览交互后使用它,这将使用FileReader 显示。

一旦他提交表单,我将创建一个FormData 对象,删除输入中的当前文件并添加所有有效文件:

var formdata = new FormData(document.getElementById('upload-form'));
if (formdata.has('pic[]') && validFiles.length) {
   formdata.delete("pic[]");
   var len = validFiles.length;
   for (i = 0; i < len; i++) {
      formdata.append("pic[]", validFiles[i]);
   }

}

如果您熟悉 js,您已经可以看到这种方法在向后兼容性方面存在严重问题,因为旧版浏览器(包括 Chrome 50 及以下或几乎任何 IE。)

好吧,放弃这个想法。我的第二个想法是执行以下操作:

  1. 用户选择要添加的图片
  2. 使用 ajax 上传上述图片,并使用 Laravel 将它们临时存储在某处
  3. 返回图片预览
  4. 让用户使用预览来重新排序文件或删除它们并跟踪他所做的事情。
  5. 提交表单后,获取所有其他信息,确定哪些文件要永久存储,哪些文件要删除和保存。

现在我不太确定该怎么做。我在想我可以为这些图像创建一个 tmp 目录,生成某种字符串作为与用户会话关联的目录的名称,将文件存储在那里并使用 Session 保存目录名称。

问题在于Session 似乎有一个全局超时,并且不能设置为在 15 分钟内到期。我看到的另一个问题是,一旦Session 到期并且用户决定不上传图像,他们将永远留在服务器上,因为我找不到允许我在Session 到期时执行代码的方法。

那么在 Laravel 中进行临时文件存储的正确方法是什么? 或者我在这里走错了方向,你能找到更好的方法来做我想做的事情吗?

提前感谢您的任何建议。

【问题讨论】:

    标签: php ajax laravel-5


    【解决方案1】:

    您的第二个想法似乎是可行的方法,但稍作修改。

    这个怎么样:

    <?php
    // Collect a list of files in a $tempLocation (modify this to your usage)
    collect(\File::files($tempLocation))->map(function($file) {
        return [
            'file' => $file,
            'basename' => pathinfo($file)['filename']
        ];
    // Filter out the non-numeric files and those that are before now
    })->filter(function($a) {
        return is_numeric($a['basename']) && $a['basename'] < time();
    // Delete each file that is outdated
    })->each(function($file) {
        try { unlink($file['file']); } catch($e) { /* Fill me in */ }
    });
    

    然后,您通常的工作流程是使用命名法上传用户的文件:

    {timestamp + timeout}.{ext}

    然后,您可以将上述函数放入每日或每周的 cron 中。所有“旧”文件都将被删除。如果您的用户想要保留文件,只需将文件移至其他地方,在非临时目录中,或将其重命名为非数字。

    这也意味着前端不需要负责删除文件或通知后端需要丢弃它们。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多