【问题标题】:How to open file from storage by URL address?如何通过 URL 地址从存储中打开文件?
【发布时间】:2018-03-29 15:32:18
【问题描述】:

我将文件存储在存储中。

不,我尝试生成打开文件的链接,例如:

http://[temp.com]/storage/tests/de139607636857fade861a3c2c472643.txt

但它不起作用。

如何通过 URL 地址从存储中打开文件?

【问题讨论】:

    标签: laravel laravel-5.5


    【解决方案1】:

    默认情况下不能通过url访问存储中的文件

    您可以使用Public Disk。为此,您需要创建从 public/storagestorage/app/public 的符号链接

    从 Larvel 5.3 及更高版本开始,您可以使用 artisan 命令来帮助您创建符号链接

    php artisan storage:link

    如果你使用的是旧版本的 Laravel,你可以找到答案如何创建符号链接here


    另一种方法是通过编辑文件 config/filesystems.php 来创建新磁盘“上传”

    'disks' => [
        'local' => [
            'driver' => 'local',
            'root'   => storage_path(),
        ],
        'uploads' => [
            'driver' => 'local',
            'root'   => public_path() . '/uploads',
        ],
    ]
    

    将文件存储在此位置

    Storage::disk('uploads')->put($file_name, $file_content);
    

    并获取文件

    asset('uploads/'. $file_name)
    

    【讨论】:

      【解决方案2】:

      storage 目录存在于 Web 根目录之外,因为其中的某些内容不一定可以公开访问。

      https://laravel.com/docs/5.5/filesystem#the-public-disk

      公共磁盘用于存放可公开访问的文件。默认情况下,公共磁盘使用本地驱动程序并将这些文件存储在storage/app/public中。要使它们可以从 Web 访问,您应该创建一个从 public/storagestorage/app/public 的符号链接。此约定会将您可公开访问的文件保存在一个目录中,当使用 Envoyer 等零停机时间部署系统时,该目录可以轻松跨部署共享。

      【讨论】:

      • 那怎么办?我可以使用 htaccess 链接到存储目录吗?
      • 这是文件的完整路径:/public_html/storage/app/tests
      • 这不是 Laravel 应用程序的标准结构。 public_html/storage/app/tests/de139607636857fade861a3c2c472643.txt 存在吗?网络服务器的用户可以访问它吗?你为什么不使用 Laravel 的内置位置和功能呢?
      【解决方案3】:

      我强烈建议不要修改 Laravel 的目录结构。

      我要做的是创建一个 URL 来下载文件,例如:

      Route::get('download/{file}', 'DownloadsController@index');
      

      在该方法的控制器中,放置一些逻辑来断言文件存在并通过响应下载来提供它,例如

      public function index($file)
      {
          $filePath = storage_path('tests/'.$file);
          if (! file_exists($filePath)) {
              // Some response with error message...
          }
      
          return response()->download($filePath);
      }
      

      然后您可以使用这样的链接下载您的文件

      http://[temp.com]/download/de139607636857fade861a3c2c472643.txt
      

      控制器的方式允许您在提供文件之前进行一些身份验证检查,或者计算文件下载的次数。

      【讨论】:

      • 虽然这确实允许额外的功能,但我更喜欢@ljubadr 的回答。通过 Laravel 代理文件比网络服务器处理的静态文件下载需要更多的资源。
      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2022-01-16
      • 2017-01-18
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多