如何使用Laravel临时存储文件


How to store files temporarily using Laravel?

使用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你可以已经看到,这种方法有严重的问题,当它涉及到向后兼容性,FormData.delete(..), .append(..).has(..)方法不支持旧的浏览器(包括Chrome 50及以下或几乎任何IE)

好吧,放弃那个想法。我的第二个想法是这样做:

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

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

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

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

提前感谢您的建议

你的第二个想法似乎是正确的,但略有修改。

这个怎么样:

<?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中。所有的"旧"文件都将被删除。如果您的用户希望保留一个文件,只需将该文件移动到其他地方,在非临时目录中,或将其重命名为非数字。

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