【问题标题】:Laravel Retrieve Images from storage to viewLaravel 从存储中检索图像以查看
【发布时间】:2021-03-30 00:14:08
【问题描述】:

我正在使用下面的代码来存储上传的文件

 $file = $request->file($file_attachment);
        $rules = [];
        $rules[$file_attachment] = 'required|mimes:jpeg|max:500';
        $validator = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            return redirect()->back()
                ->with('uploadErrors', $validator->errors());
        }

        $userid = session()->get('user')->id;
        $destinationPath = config('app.filesDestinationPath') . '/' . $userid . '/';
        $uploaded = Storage::put($destinationPath . $file_attachment . '.' . $file->getClientOriginalExtension(), file_get_contents($file->getRealPath()));

上传的文件存储在storage/app/2/filename.jpg

我想向用户展示他上传的文件。我该怎么做?

$storage = Storage::get('/2/filename.jpg');

我收到不可读的文本。我可以确认文件已被读取。但是如何将其作为图像显示给用户。

希望我能说清楚。

工作解决方案

display.blade.php

<img src="{{ URL::asset('storage/photo.jpg') }}" />

web.php

Route::group(['middleware' => ['web']], function () {
    Route::get('storage/{filename}', function ($filename) {
        $userid = session()->get('user')->id;
        return Storage::get($userid . '/' . $filename);
    });
});

感谢:@Boghani Chirag 和 @rkj

【问题讨论】:

  • 您是否尝试过从公共文件夹创建指向您的图像存储文件夹的符号链接?然后从那里访问网址? (一些 nginx/apache 配置可能需要允许符号链接目录)虽然我不推荐这样做,但尝试将其保存在公用文件夹中。就个人而言,我更喜欢在处理后将图像上传到某些 cdn 或图像提供商(如 cloudinary)并从他们那里提供 url。
  • 没有。我不能那样做。用户信息比较敏感,我不能把它放在公共文件夹或云端...
  • 我明白了,将其用作数据uris 怎么样?使用 img 标签为用户提供服务:css-tricks.com/data-uris
  • 您可以将文件名存储在db中,然后您可以轻松找到在刀片文件中显示的路径

标签: laravel


【解决方案1】:

文件不能像你说的那样公开访问然后像这样读取文件

$userid = session()->get('user')->id;
$contents = Storage::get($userid.'/file.jpg'); 

假设您的文件位于路径 storage/app/{$userid}/file.jpg 默认磁盘为local 检查config/filesystems.php

文件可公开访问

如果您想公开访问您的文件,请将文件存储在此 storage/app/public 文件夹中。您可以在其中创建子文件夹并在那里上传。一旦你将文件存储在 storage/app/public 中,那么你只需要创建一个符号链接,laravel 就有它的 artisan 命令。

php artisan storage:link

这会创建一个storage/app/publicpublic/storage 的符号链接。意味着现在您可以像这样访问您的文件

$contents = Storage::disk('public')->get('file.jpg'); 

这里的文件物理路径在storage/app/public/file.jpg,它通过符号链接路径public/storage/file.jpg访问

假设您有子文件夹 storage/app/public/uploads 存储您上传的文件,然后您可以像这样访问它

$contents = Storage::disk('public')->get('uploads/file.jpg');

当您在公共文件夹中进行上传时,您可以在视图中访问它

echo asset('storage/file.jpg'); //without subfolder uploads

echo asset('storage/uploads/file.jpg');

查看详情https://laravel.com/docs/5.6/filesystem#configuration

【讨论】:

    【解决方案2】:

    记得把你的文件夹放在 storage/app/public/

    创建符号链接符号链接以访问此文件夹

    php artisan storage:link
    

    如果您想访问 2 个文件夹的配置文件图像,请在您的刀片文件中执行此操作

    <img src="{{ asset('storage/2/images/'.$user->profile_image) }}" />
    

    【讨论】:

      【解决方案3】:

      Laravel 8

      控制器

      class MediaController extends Controller
      { 
      
          public function show(Request $request, $filename)
          {
              $folder_name = 'upload';
      
              $filename = 'example_img.jpeg';
      
              $path = $folder_name.'/'.$filename;
      
              if(!Storage::exists($path)){
                  abort(404);
              }
      
              return Storage::response($path);
          }
      }
      

      路线

      Route::get('media/{filename}', [\App\Http\Controllers\MediaController::class, 'show']);
      

      【讨论】:

        【解决方案4】:

        试试这个:

        Storage::disk('your_disk_name')->getDriver()->getAdapter()->applyPathPrefix('your_file_name');
        

        祝你好运!

        【讨论】:

        【解决方案5】:

        你能试试这个代码吗

        routes.php

        Route::group(['middleware' => ['web']], function() {
            Route::get('storage/storage_inner_folder_fullpath/{filename}', function ($filename) {
                return Image::make(storage_path() . '/storage_inner_folder_fullpath/' . $filename)->response();
            });
        });
        

        查看文件代码

        <img src="{{ URL::asset('storage/storage_inner_folder_fullpath/'.$filename) }}" />
        

        谢谢

        【讨论】:

        • 什么是“图像”?您没有指定定义。
        【解决方案6】:

        这样上传

        $uploadedFile = $request->file('photo');
        $photo = "my-prefix" . "_" . time() . "." . $uploadedFile->getClientOriginalExtension();
        $photoPath = \Illuminate\Support\Facades\Storage::disk('local')->putFileAs(
           "public/avatar",
           $uploadedFile,
           $photo
        );
        

        然后像这样访问

        <img src="{{ asset('storage/avatar/'.$filename) }}" />
        

        【讨论】:

        • &lt;img src="{{ asset('storage/avatar/img1.png') }}" /&gt;帮我展示图片
        【解决方案7】:

        你可以试试这个

        $storage = Storage::get(['type_column_name']);
        

        【讨论】:

        • 什么是 type_column_name
        • 你的表列名在哪里存储图片路径
        【解决方案8】:

        创建路线:

        Route::get('image/{filename}', 'HomeController@displayImage')->name('image.displayImage');
        

        创建控制器方法:

        public function displayImage($filename)
        
        {
        
          
        
            $path = storage_public('images/' . $filename);
        
           
        
            if (!File::exists($path)) {
        
                abort(404);
        
            }
        
          
        
            $file = File::get($path);
        
            $type = File::mimeType($path);
        
          
        
            $response = Response::make($file, 200);
        
            $response->header("Content-Type", $type);
        
         
        
            return $response;
        
        }
        
        <img src="{{ route('image.displayImage',$article->image_name) }}" alt="" title="">
        

        【讨论】:

          猜你喜欢
          • 2019-11-13
          • 2020-08-15
          • 2021-11-08
          • 2016-12-18
          • 2020-08-11
          • 2020-10-23
          • 1970-01-01
          • 2017-08-30
          相关资源
          最近更新 更多