disk(config('admin.upload.disk')); } /** * Set default options form image field. * * @return void */ protected function setupDefaultOptions() { $defaultOptions = [ 'overwriteInitial' => false, 'initialPreviewAsData' => true, 'browseLabel' => trans('admin.browse'), 'showRemove' => false, 'showUpload' => false, 'dropZoneEnabled' => false, //dropzone disabled by default for backward compatibility // 'initialCaption' => $this->initialCaption($this->value), 'deleteExtraData' => [ $this->formatName($this->column) => static::FILE_DELETE_FLAG, static::FILE_DELETE_FLAG => '', '_token' => csrf_token(), '_method' => 'PUT', ], ]; if ($this->form instanceof Form) { $defaultOptions['deleteUrl'] = $this->form->getResource().'/'.$this->form->getKey(); } $this->options($defaultOptions); } /** * Set preview options form image field. * * @return void */ protected function setupPreviewOptions() { if (! $this->removable) { return; } $this->options([ //'initialPreview' => $this->preview(), 'initialPreviewConfig' => $this->initialPreviewConfig(), ]); } /** * Allow use to remove file. * * @return $this */ public function removable() { $this->removable = true; return $this; } /** * Set options for file-upload plugin. * * @param array $options * * @return $this */ public function options($options = []) { $this->options = array_merge($options, $this->options); return $this; } /** * Set disk for storage. * * @param string $disk Disks defined in `config/filesystems.php`. * * @throws \Exception * * @return $this */ public function disk($disk) { try { $this->storage = Storage::disk($disk); } catch (\Exception $exception) { if (! array_key_exists($disk, config('filesystems.disks'))) { admin_error( 'Config error.', "Disk [$disk] not configured, please add a disk config in `config/filesystems.php`." ); return $this; } throw $exception; } return $this; } /** * Get storage instance. * * @return \Illuminate\Filesystem\Filesystem|null */ public function getStorage() { return $this->storage; } /** * Specify the directory and name for upload file. * * @param string $directory * @param null|string $name * * @return $this */ public function move($directory, $name = null) { $this->dir($directory); $this->name($name); return $this; } /** * Specify the directory upload file. * * @param string $dir * * @return $this */ public function dir($dir) { if ($dir) { $this->directory = $dir; } return $this; } /** * Set name of store name. * * @param string|callable $name * * @return $this */ public function name($name) { if ($name) { $this->name = $name; } return $this; } /** * Use unique name for store upload file. * * @return $this */ public function uniqueName() { $this->useUniqueName = true; return $this; } /** * Use sequence name for store upload file. * * @return $this */ public function sequenceName() { $this->useSequenceName = true; return $this; } /** * Get store name of upload file. * * @param UploadedFile $file * * @return string */ protected function getStoreName(UploadedFile $file) { if ($this->useUniqueName) { return $this->generateUniqueName($file); } if ($this->useSequenceName) { return $this->generateSequenceName($file); } if ($this->name instanceof \Closure) { return $this->name->call($this, $file); } if (is_string($this->name)) { return $this->name; } return $file->getClientOriginalName(); } /** * Get directory for store file. * * @return mixed|string */ public function getDirectory() { if ($this->directory instanceof \Closure) { return call_user_func($this->directory, $this->form); } return $this->directory ?: $this->defaultDirectory(); } /** * Upload file and delete original file. * * @param UploadedFile $file * * @return mixed */ protected function upload(UploadedFile $file) { $this->renameIfExists($file); if (! is_null($this->storagePermission)) { return $this->storage->putFileAs($this->getDirectory(), $file, $this->name, $this->storagePermission); } return $this->storage->putFileAs($this->getDirectory(), $file, $this->name); } /** * If name already exists, rename it. * * @param $file * * @return void */ public function renameIfExists(UploadedFile $file) { if ($this->storage->exists("{$this->getDirectory()}/$this->name")) { $this->name = $this->generateUniqueName($file); } } /** * Get file visit url. * * @param $path * * @return string */ public function objectUrl($path) { if (URL::isValidUrl($path)) { return $path; } if ($this->storage) { return $this->storage->url($path); } return Storage::disk(config('admin.upload.disk'))->url($path); } /** * Generate a unique name for uploaded file. * * @param UploadedFile $file * * @return string */ protected function generateUniqueName(UploadedFile $file) { return md5(uniqid()).'.'.$file->getClientOriginalExtension(); } /** * Generate a sequence name for uploaded file. * * @param UploadedFile $file * * @return string */ protected function generateSequenceName(UploadedFile $file) { $index = 1; $extension = $file->getClientOriginalExtension(); $originalName = $file->getClientOriginalName(); $newName = $originalName.'_'.$index.'.'.$extension; while ($this->storage->exists("{$this->getDirectory()}/$newName")) { $index++; $newName = $originalName.'_'.$index.'.'.$extension; } return $newName; } /** * Destroy original files. * * @return void. */ public function destroy() { $this->deleteFile($this->original); } /** * Destroy files. * * @param $path */ protected function deleteFile($path) { if (! $path) { return; } if ($this->storage->exists($path)) { $this->storage->delete($path); } else { $prefix = $this->storage->url(''); $path = str_replace($prefix, '', $path); if ($this->storage->exists($path)) { $this->storage->delete($path); } } } public function storagePermission($permission) { $this->storagePermission = $permission; return $this; } }