如果是动态名称,如何获取存储在 /storage/public 中的图像名称

How can get the name of a image stored in /storage/public if was dynamic name

我的问题是我在 laravel 中的网站上上传了一张图片,但数据库使用一个奇怪的名称和扩展名保存了我本地存储的路径:

图片在 Storage/app/public 中上传正常,但使用了另一个名称(如哈希码):

现在,如何通过数据库查询在/Storage/Public中获取此名称,或者如何使用原始名称或ID上传图像?

代码: 表单上传:

<form class="formulario" method="POST" enctype='multipart/form-data' action="{{ route('add_taller') }}">
    @csrf
    
    <h4>Añade el titulo correspondiente</h4><input name="titulo">
    <h4>Añade un logo al taller</h4><input type="file" name="icono" class="taller_form {{ $errors->has('name') ? 'alert alert-danger' : ''}}" />
     {!! $errors->first('image', '<p class="alerta">:message</p>') !!}
    <h4>Añade una descripción</h4><textarea name="descripcion" rows="10" cols="50" value="{{ old('textarea') }}"></textarea>
     {!! $errors->first('string', '<p class="alerta">:message</p>') !!}
        
        <button type="submit">Subir a la web</button>
    </form>

在控制器中:

public function add_taller(Request $request)
{  

    $request->file('icono')->store('public');
    $user = Auth::user();
    DB::table('talleres')->insert([
    'icono' =>$request->icono,
    'titulo' => $request->titulo, 
    'descripcion' => $request->descripcion,
    'user_id' => $user->id,
    'fecha'=> now()]);

     return view('home');

}

查看需要展示图片的地方:

@foreach($datos as $dato)
<div class="taller">
    <div>
        <img src="{{Storage::url($dato->icono)}}" alt="" srcset=""  class="icon_taller">
    </div>
    <div>
    
        <h4>{{$dato->titulo}}</h4>
        <p>{{$dato->descripcion}}</p>
    </div>
    <div class="botones_area">
        <button>Descarga</button>
        <button>Contacto</button>
    </div>
</div>
@endforeach

正如我所见,您没有使用文件扩展名保存路径。

当您使用 $request->file('icono')->store('public'); 时,您会生成一个临时文件,文件扩展名由 Laravel 和 MIME 类型决定。

关于什么:

public function add_taller(Request $request)
{  

    $path = Storage::putFileAs(
       'public', $request->file('icono'), Str::uuid()
    );

    $user = Auth::user();

    DB::table('talleres')->insert([
        'icono' => $path,
        'titulo' => $request->titulo, 
        'descripcion' => $request->description,
        'user_id' => $user->id,
        'fecha'=> now()]
    );

     return view('home');
}

对于文件名,我使用 Str::uuid 函数生成具有不同 ID 的名称。对于存储文件,我使用了 Storage Laravel facade,在这里快速浏览一下:https://laravel.com/docs/8.x/filesystem#specifying-a-file-name

您如何看待这些变化?