Извлечение нескольких файлов (изображений) из хранилища в Laravel - PullRequest
0 голосов
/ 28 апреля 2020

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

Мой контроллер для загрузки файлов (formdata):

PicturesController. php

public function store(Request $request)
{
    $images = $request->file();
    $client = $request->get("ClientID");
    $treatment = $request->get("TreatmentID");

    $path = 'clients\\' . $client . '\\' . $treatment . '\\';


    foreach ($images as $image) {

        //StorePicture
        $randomName = Str::random(8);
        $date = date("_d-m-Y_H-i-s.", time());
        $extension = $image->extension();
        $filename = $randomName.$date.$extension;
        $image->storeAs($path, $filename);

        //Save to database
        $picture = new Picture();
        $picture->picPath = $path.$filename;
        $picture->Treatment()->associate($treatment);

        $picture->save();
    }

}

Здесь хранятся файлы без каких-либо проблем.

Я искал везде, где только мог, но не нашел никакого решения, чтобы получить изображения и передать их на vue. js внешний интерфейс. У кого-нибудь есть ссылка, где это сделано или и есть идея?

Пока:

public function show($id)
{
    //Collection of Picture (paths...)
    $picturesCollection= Picture::where('fkTreatment', $id)->orderBy('created_at', 'desc')->get();

    $images = array();

    foreach ($picturesCollection as $pic) {
        //Store images in an array to return it to ModalDisplay.vue
        $images[] = ?;
    }

    return $images;
}

Спасибо за чтение.

1 Ответ

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

TL: DR

Атрибут picPath должен содержать фактический путь к файлу

Я делюсь с вами фрагментом кода, который я использовал для управления своими файлами

    $auth_id = 0;
    $storage_details = [];

    if (auth()->check()) {
        $auth_id = auth()->user()->id;
    }

    $file_name = $auth_id . '_' . date('d-m-Y_H-i-s') . '.' . $file->getClientOriginalExtension();

    $store = $this->getStorage()->putFileAs('records', $file, $file_name);
    if (!$store) {
        return $storage_details;

    } else {

        $storage_details['file_path'] = $this->getStorage()->getDriver()->getAdapter()->getPathPrefix() . 'records' . DIRECTORY_SEPARATOR . $file_name;
        $storage_details['file_name'] = $file_name;
        $storage_details['driver'] = $this->getStorage()->getDriver();
        $storage_details['disk'] = $this->getDisk();
        $storage_details['relative_path'] = 'records' . DIRECTORY_SEPARATOR . $file_name;

        return $storage_details;
    }

И здесь Вот как я сохраняю их в БД

    $task = new self();
    $task->id = $task_id;
    $task->user_id = auth()->user()->id;
    $task->type = 'process_records';

    $meta = [];
    if (array_key_exists('file_path', $storage_details)) {
        $meta['file_path'] = $storage_details['file_path'];
    }
    if (array_key_exists('file_name', $storage_details)) {
        $meta['file_name'] = $storage_details['file_name'];
    }
    if (array_key_exists('driver', $storage_details)) {
        $meta['driver'] = $storage_details['driver'];
    }
    if (array_key_exists('disk', $storage_details)) {
        $meta['disk'] = $storage_details['disk'];
    }
    if (array_key_exists('relative_path', $storage_details)) {
        $meta['relative_path'] = $storage_details['relative_path'];
    }

    $task->meta = $meta;
    $task->save();

Теперь все, что вам нужно, это перебрать относительный путь, и если в будущем вы измените свой драйвер на AWS или что-то еще, вы можете легко реализовать logi c

...