代码之家  ›  专栏  ›  技术社区  ›  Jesse Orange

在laravel中下载文件

  •  2
  • Jesse Orange  · 技术社区  · 6 年前

    在laravel中,我有一个页面,我试图提供到文件的下载链接,我正在使用laravel文件管理器上传这些文件。

    这些文件的路径设置在 lfm.php 配置文件为:

    /*
    |--------------------------------------------------------------------------
    | Working Directory
    |--------------------------------------------------------------------------
    */
    
    // Which folder to store files in project, fill in 'public', 'resources', 'storage' and so on.
    // You should create routes to serve images if it is not set to public.
    'base_directory' => 'public',
    
    'images_folder_name' => 'assets/uploads/images',
    'files_folder_name'  => 'storage/files',
    
    'shared_folder_name' => 'shares',
    'thumb_folder_name'  => 'thumbs',
    

    我关注了laravel网站上关于 public storage 包含以下内容的文件夹:

    公共磁盘用于将要公开的文件 可接近的。默认情况下,公共磁盘使用本地驱动程序和 将这些文件存储在 存储/应用程序/公共 . 使他们容易接近 从网上,你应该 创建符号链接 公共/存储 存储/应用程序/公共 .

    本会议将使您的 一个目录中的文件,可以轻松地跨部署共享 当使用像特使这样的零停机时间部署系统时。

    要创建符号链接,可以使用“存储:链接Artisan” 命令:

    php Artisan存储:链接

    在此之前,我还设置了以下内容:

    1. 在我的 .env 我已将应用程序URL更改为: http://127.0.0.1:8000 在哪 php artisan server 启动本地服务器。
    2. filesystems.php 我将public数组更改为:

      'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],

    然后我创建了符号链接。

    在我的公共目录中,我得到了以下信息:

    enter image description here

    这是一个链接 storage/app/public

    然后我上传了一个文件到 shares 所以在我的 存储 我现在拥有的文件夹:

    app/public/shares/name-of-file

    为了测试这个,我有以下控制器和视图:

    控制器:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Storage;
    
    class TemplateController extends Controller
    {
        public function index()
        {
            $files = Storage::allFiles('files/shares');
    
            return view('pages.templates-and-tools.index', compact('files'));
        }
    }
    

    考虑相关部分

    <table id="templates" class=" table-striped table-vaccancies table-responsive">
        <thead>
            <tr>
                <th class="col-md-1 col-xs-1">Type</th>
                <th class="col-md-6 col-xs-6">Name</th>
                <th class="col-md-2 col-xs-2">Category</th>
                <th class="col-md-2 col-xs-2">Modified</th>
                <th class="col-md-1 col-xs-1">Size</th>
    
            </tr>
            <tr class="warning no-result">
                <td colspan="5">
                    <i class="fa fa-warning"></i>
                    <h3 class="text-center"> No result</h3>
                </td>
            </tr>
        </thead>
        <tbody>
    
    
            @foreach ($files as $file) 
            @php 
    
    
            $date = Storage::lastModified($file); $date = gmdate("d/m/Y - H:i", $date); 
            $size = Storage::size($file); $size = ceil ($size/1000); 
            $url = Storage::url($file);
    
            $fileName = pathinfo($file)['filename']; 
            $Category = pathinfo($file)['dirname']; 
            $type = pathinfo($file)['extension'];
            $Category = basename(dirname( $file)) 
            @endphp
    
            <tr>
                <td>{{$type}}</td>
                <td>
                    <a href="{{ Storage::download($url) }} ">{{$fileName }}</a>
                </td>
                <td>{{$Category}}</td>
                <td> {{$date}}</td>
                <td>{{$size}}kb</td>
            </tr>
    
    
            @endforeach
    
        </tbody>
    </table>
    

    上面抓取了下面存储文件夹中的所有内容 files/shares ,然后我只需在每个表单元格中吐出一堆关于文件的信息。

    我面临的问题是这样一句话:

    <a href="{{ Storage::download($url) }}">{{$fileName }}</a>

    它返回以下错误:

    File not found at path: http:/127.0.0.1:8000/storage/files/shares/Hummingbird_Technologies_ES.pdf (View: C:\xampp\htdocs\my-newable\resources\views\pages\templates-and-tools\index.blade.php)

    这是一个非常直接的错误,但是…

    enter image description here

    您可以看到该文件存在。

    那么,我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  2
  •   ysfkaya    6 年前

    首先,检查你的文件是否上传成功。

    然后在 a 标签 download 参数。这样地。

    <a href="{{ Storage::url($path) }}" download>{{$fileName }}</a>

    或在您的 标签。这样地。

    <a href="{{ route('download_url',$path) }}">Download</a>

    控制器。

     public function download($path)
     {
         return Storage::download($path);
     }