使用Laravel 5.2
,我正在处理一个上传表单,该表单应该允许用户选择最多10张图片,显示他们的预览,然后让他对它们进行排序,添加更多图像或删除他没有的图像# 39;我想上传。
使用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浏览器)。
好吧废弃这个想法。我的第二个想法是做以下事情:
现在我不太清楚如何做到这一点。我想我可以为这些图像创建一个tmp目录,生成某种字符串作为与用户会话关联的目录的名称,将文件存储在那里并使用Session
保存目录名。 / p>
这个问题是Session
似乎有一个全局超时,并且不能设置为在15分钟内到期。我看到的另一个问题是,一旦Session
到期并且用户决定不上传图像,他们将永远保留在服务器上,因为我找不到允许我在{{{{{{{{ 1}}到期。
那么在Laravel中进行临时文件存储的正确方法是什么? 或者我在这里走错了方向,你能看到一个更好的方法来做我想做的事吗?
提前感谢任何建议。
答案 0 :(得分:0)
你的第二个想法似乎是要走的路,但略有修改。
这个怎么样:
<?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 */ }
});
您通常的工作流程就是上传您的用户&#39;带有命名法的文件:
{timestamp + timeout}.{ext}
然后您将上述功能放在每日或每周的cron中。所有&#34; old&#34;文件将被删除。如果您的用户想要保留文件,只需将文件移动到其他位置,非临时目录中,或将其重命名为非数字文件。
这也意味着前端不需要处理删除文件或通知你的后端他们需要被丢弃。
我希望这会有所帮助。