Laravel - Как переместить файл из локального хранилища в другое хранилище? - PullRequest
0 голосов
/ 13 апреля 2020

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

Я делаю следующее:

  • Я загружаю файл (который может быть большим)

  • Я сохраняю его на локальном хранилище

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

Проблема в том, что когда я делаю последний шаг, я получить следующую ошибку

ErrorException
fopen(files/7u7v6LYq72vmXLqeWPsc6b0khiy9pEbFicVJuK2W.pdf): failed to open stream: No such file or directory

Я пробовал разные подходы, но не могу найти решение.

Мой код

Метод контроллера:

public function uploadToDropbox(Request $request){
        $data = $request->validate([
            'file' => 'required|mimes:jpeg,jpg,png,doc,docx,pdf,txt,mp3,mp4,avi|max:600000',
            'first_name' => 'required',
            'last_name' => 'required',
        ]);

        /** @var \Symfony\Component\HttpFoundation\File\File $uploadedFile */
        $uploadedFile = $data['file'];

        $path = Storage::disk('local')->putFileAs( 'file', $uploadedFile, $uploadedFile->getClientOriginalName());

        $file = new File();
        $file->first_name = $data['first_name'];
        $file->last_name = $data['last_name'];
        $file->file = $path;
        $file->original_name = $uploadedFile->getClientOriginalName();
        $file->size = $uploadedFile->getSize();
        $file->real_path = $uploadedFile->getRealPath();
        $file->save();

        $result = ProcessFile::dispatch($file);

        if($result){
            return Redirect::back()->withErrors(['msg'=>'Successfully file uploaded']);
        } else {
            return Redirect::back()->withErrors(['msg'=>'File failed to upload']);
        }
}

Задание очереди:

public function handle()
{
        if (Storage::disk('local')->exists($this->file->file)) {
            $name = strtolower($this->file->first_name) . '_' . strtolower($this->file->last_name);

            $rez = Storage::disk('dropbox')->putFileAs(
                'challenge-files/' . $name . '/',
                $this->file->file,
                $this->file->original_name
            );

            Log::info('message: ' . $rez);
        } else {
            Log::alert('falseeeee');
        }
}

Файловая система Адаптер метод puthFileAs:

public function putFileAs($path, $file, $name, $options = [])
{
        $stream = fopen(is_string($file) ? $file : $file->getRealPath(), 'r');

        // Next, we will format the path of the file and store the file using a stream since
        // they provide better performance than alternatives. Once we write the file this
        // stream will get closed automatically by us so the developer doesn't have to.
        $result = $this->put(
            $path = trim($path.'/'.$name, '/'), $stream, $options
        );

        if (is_resource($stream)) {
            fclose($stream);
        }

        return $result ? $path : false;
}

файловые системы. php локальные конфигурации дисков

'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            'permissions' => [
                'file' => [
                    'public' => 0664,
                    'private' => 0600,
                ],
                'dir' => [
                    'public' => 0775,
                    'private' => 0700,
                ],
            ],
],

1 Ответ

0 голосов
/ 13 апреля 2020

Возможно, вы не изменили сопоставления разрешений в файле конфигурации файловых систем.

Найдите массив

dir

и проверьте если номер

publi c

равен

0775

, если это не так, измените его на этот номер. Ищите

file

change 'public' => 0664

...