下载后从存储中删除文件

时间:2019-02-12 16:14:41

标签: ajax laravel post axios

我正在研究媒体资产管理系统。我希望用户能够使用文件的宽度,高度,扩展名和色彩空间填写表格,然后转换图像并将其作为下载内容提供。

我可以通过使用新创建的文件的URL响应Post-Request来使其工作。

我想要的是在下载后或一段时间后删除该文件。 (或者最好是使用laravels download()响应的方法,我显然不能在Axios / Ajax发布请求中使用它。)

感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

对我来说,我喜欢使用cron处理这种情况

您可以阅读详细信息here

添加任何列以检查其是否已下载(例如,状态为0或1)

,您可以在模型上创建访问器以计算日期差异

public function getRangeDateAttribute(){
 $today = Carbon::now()->startOfDay();
 $downloadDate =  $this->created_at;
 $datediff =  $today->diffInDays($downloadDate);
 return $datediff
}

然后在任务计划中添加示例代码:

if($media->status == 1 || $media->rangeDate > 7 ){ //checking the status & range date passed specific days you wanted
do whatever you wanted here
}

答案 1 :(得分:0)

有两种方法可以做到这一点。

假设您在storage/app/download.zip中有一个文件:

1。。由于Laravel在内部使用Symfony的HttpFoundation,因此您可以使用deleteFileAfterSend方法:

public function download()
{
    return response()
        ->download(storage_path('app/download.zip'))
        ->deleteFileAfterSend(true);
}

2。。创建一个Terminable Middleware,在准备好下载响应后删除该文件。

class StorageDownload
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        \Storage::delete('download.zip');
    }
}

您需要register the middlwareassign it to your route才能正常工作。


对于使用JavaScript触发下载,可以使用设置窗口位置这样简单的方法:

axios
    .post('files/export/' + file.id, formData)
    .then(function() {
        window.location = 'files/download/' + file.id
    });

请放心,这不会离开当前页面,只会触发下载。