Laravel, как найти загруженные файлы по определенному шаблону в названии файлов?

#php #laravel #download #upload

#php #laravel #Скачать #загрузка

Вопрос:

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

 $files = $request->file('files');

        if ($request->hasFile('files')) {
            foreach ($files as $file) {
                //Get filename with the extension
                $fileNameWithExt = $file->getClientOriginalName();
                //Filename to store example: lead_4_document.pdf
                $fileNameToStore =  'lead_' . $lead->id . '_' . $fileNameWithExt;
                //Upload image
                $path = $file->storeAs('/user_uploads', $fileNameToStore);

                $lead->uploadFile()->create(array('filename' => $fileNameToStore, 'file_url' => $path, 'lead_id' => $lead->id));
            }
        }
  

Поэтому, по сути, я добавляю lead_ идентификатор lead и другой _ к тому, что файл был первоначально вызван во время загрузки. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что мне нужно получить связанные файлы в соответствии с моими идентификаторами лидов. Вот моя попытка до сих пор:

 $searchParam = 'lead_'.$lead->id.'_';
//$fileNames = File::glob('storage/user_uploads/'.$searchParam.'*');
//$files = File::get($fileNames);
$allFiles = Storage::files('user_uploads');
dd($allFiles);
  

Просто чтобы уточнить, способ ‘File::glob’, похоже, работает, хотя он выводит только имена файлов, а не фактические файлы в качестве объекта, что мне и нужно.

Ответ №1:

Хорошо, поэтому я сделал шаг назад и обошел весь этот связанный загруженный файл, чтобы вести отношения по-другому. Вот как я это сделал, на случай, если кто-нибудь наткнется на это и окажется в той же лодке, что и я. Загрузка файла теперь выполняет несколько действий:

 //check if file(s) is present in the request
        if ($request->hasFile('files')) {
            //checks if a directory already exists for a given lead (by id)
            if (Storage::exists('/leads/'.$request->lead_id)) {
                //if yes set the directory path to the existing folder
                $directory = '/leads/'.$request->lead_id;
            }
            else {
                //if not create a new directory with the lead id
                Storage::makeDirectory('/leads/'.$request->lead_id);
                $directory = '/leads/'.$request->lead_id;
            }

            foreach ($files as $file) {
                //Get filename with the extension
                $fileNameWithExt = $file->getClientOriginalName();
                //Filename to store example: lead_4_document.pdf
                $fileNameToStore =  'lead_' . $lead->id . '_' . $fileNameWithExt;
                //Upload image
                //'/user_uploads'
                $file->storeAs($directory, $fileNameToStore);

                //$lead->uploadFile()->create(array('filename' => $fileNameToStore, 'file_url' => $path, 'lead_id' => $lead->id));
            }
        }
  

Таким образом, по сути, вместо того, чтобы пытаться поместить все файлы в одну папку, а затем проверять отдельные файлы на наличие предустановки ‘lead_ ##’, я вместо этого создаю папку с идентификатором лидерства, затем я использую следующий способ в своей функции просмотра:

  $directory = '/leads/'.$lead->id;

        if (Storage::exists($directory)) {
            $files = File::files('storage/'.$directory);
        }
        else {
            $files = '';
        }
  

Просто проверьте, существует ли каталог с заданным идентификатором ведущего, затем, если загруженные файлы есть, либо присвоите ему содержимое, либо установите его пустым (это используется для отображения раздела «вложения» на моей странице, если он не пустой).