You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.2 KiB
96 lines
3.2 KiB
<?php
|
|
|
|
namespace App\Http\Livewire;
|
|
|
|
use Livewire\Component;
|
|
use Livewire\WithFileUploads;
|
|
use App\Models\ProcessHistories;
|
|
use Illuminate\Support\Facades\Bus;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use App\Jobs\ProcessImagesJob;
|
|
|
|
class ImageUpload extends Component
|
|
{
|
|
use WithFileUploads;
|
|
|
|
public $images = []; // Массив из 3 элементов
|
|
public $imagePreviews = [];
|
|
public $historyId;
|
|
public $status = 'idle';
|
|
// Возможные статусы: 'idle', 'uploaded', 'processing', 'done', ...
|
|
public $progressMessage = '';
|
|
public $queueJobId;
|
|
|
|
protected $rules = [
|
|
'images.*' => 'image|max:4096', // 4MB, можно изменить по желанию
|
|
];
|
|
|
|
public function updatedImages($value, $key)
|
|
{
|
|
// После обновления файла, генерируем превью
|
|
$this->validateOnly('images.*');
|
|
|
|
if ($this->images[$key]) {
|
|
$this->imagePreviews[$key] = $this->images[$key]->temporaryUrl();
|
|
}
|
|
}
|
|
|
|
|
|
public function startProcessing()
|
|
{
|
|
$this->validate();
|
|
|
|
// Сохраняем изображения
|
|
$savedImages = [];
|
|
foreach ($this->images as $uploaded) {
|
|
$path = $uploaded->store('images', 'public');
|
|
$savedImages[] = [
|
|
'path' => $path,
|
|
'original_name' => $uploaded->getClientOriginalName()
|
|
];
|
|
}
|
|
|
|
// Создаём запись в истории
|
|
$history = ProcessHistories::create([
|
|
'images' => $savedImages,
|
|
'started_at' => now(),
|
|
]);
|
|
|
|
$this->historyId = $history->id;
|
|
$this->status = 'processing';
|
|
$this->progressMessage = 'Ставим в очередь на обработку...';
|
|
|
|
// Отправляем задачу в очередь
|
|
$job = new ProcessImagesJob($history->id);
|
|
$dispatch = dispatch($job);
|
|
|
|
// Можно при желании сохранить ID задачи, если нужно
|
|
// $this->queueJobId = ... (в зависимости от драйвера очереди)
|
|
|
|
// Дальше фронт будет периодически обновлять состояние либо
|
|
// мы можем слушать события Livewire (Broadcasting) по готовности
|
|
}
|
|
|
|
public function pollStatus()
|
|
{
|
|
if ($this->historyId) {
|
|
$history = ProcessHistories::find($this->historyId);
|
|
if ($history) {
|
|
if ($history->finished_at) {
|
|
$this->status = 'done';
|
|
$this->progressMessage = 'Обработка завершена. Файл: ' . $history->step_file_name;
|
|
} else {
|
|
// Можно отобразить прогресс, если в историях где-то хранится этап
|
|
$count = $history->processed_count;
|
|
$this->progressMessage = "Обработка в процессе... {$count}/3 изображений";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.image-upload');
|
|
}
|
|
}
|