Удаление файла из хранилища после загрузки - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над системой управления медиаресурсами.Я хочу, чтобы пользователь мог заполнить форму с шириной, высотой, расширением и цветовым пространством файла, затем преобразовать изображение и отправить его обратно для загрузки.

Я могу заставить это работать, отвечая на запросПост-запрос с URL-адресом вновь созданного файла.

Я хочу, чтобы этот файл был удален после загрузки или через некоторое время.(Или, предпочтительно, способ использовать ответ laravels download (), который я, очевидно, не могу использовать внутри почтового запроса Axios / Ajax).

Спасибо за вашу помощь:)

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Есть два способа сделать это.

Предположим, у вас есть файл в storage/app/download.zip:

1. Потому чтоLaravel использует внутреннюю HttpFoundation от Symfony, вы можете использовать метод 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');
    }
}

Вам нужно зарегистрировать промежуточное программное обеспечение и назначить его вашему маршруту , чтобы он работал.


Что касается запуска загрузки с использованием JavaScript, то будет работать что-то столь же тривиальное, как установка местоположения окна:

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

Не волнуйтесь, это не отойдет от вашей текущей страницы, это просто вызовет загрузку.

0 голосов
/ 12 февраля 2019

для меня, мне нравится обрабатывать этот случай, используя cron

, вы можете прочитать подробности здесь

добавить любой столбец, чтобы проверить, загружен он или нет (например, статуссо значением 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
}
...