为什么下载PDF的超链接不起作用? (没有文件)

I developed system for creating articles, each post except title and content consist possibility for uploading PDF.File names are stored in the database and they are written on the hyperlinks necessary to download the file.Now the problem is that when I want to download the file, it shows me a mistake in the browser. Did anyone knows what is a problem ?

Database

enter image description here

Location of PDF files

enter image description here

result

enter image description here

Posts Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//including post model to controller
use App\Post;
//if we want to use sql syntax for queries 
use DB; 

class PostsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {   
        //list articles by desc row

        $posts= Post::orderby('created_at', 'desc')->paginate(3);
        return view('posts.index')-> with('posts', $posts);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
       return view('posts.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {   
        $this -> validate($request,[
            'title' => 'required',
            'content' => 'required'

        ]);


     // Handle File Upload
        if($request->hasFile('image')){
            // Get filename with the extension
            $filenameWithExt = $request->file('image')->getClientOriginalName();
            // Get just filename
            $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);
            // Get just ext
            $extension = $request->file('image')->getClientOriginalExtension();
            // Filename to store
            $fileNameToStore= $filename.'_'.time().'.'.$extension;
            // Upload Image
            $path = $request->file('image')->storeAs('public/upload', $fileNameToStore);
        } else {
            $fileNameToStore = 'noimage.jpg';
        }









        //create new post
        $post= new Post;

        $post -> title = $request -> input('title');
        $post -> content = $request -> input('content');
        $post->file_name = $fileNameToStore;
        $post -> save();


            return redirect('/posts') ->with('success', 'Post Created');



    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //list post while we enter through link
        $post= Post::find($id);
        return view('posts.show')-> with('post', $post);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
         $post= Post::find($id);
        return view('posts.edit')-> with('post', $post);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
            $this -> validate($request,[
            'title' => 'required',
            'content' => 'required'

        ]);
        //create new post
        $post= Post::find($id);
        $post -> title = $request -> input('title');
        $post -> content = $request -> input('content');
        $post -> save();
            return redirect('/posts') ->with('success', 'Post Updated');

    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $post= Post::find($id);
        $post -> delete();
          return redirect('/posts') ->with('success', 'Post Removed');
    }
}

show.blade.php

@extends('layouts.app')

@section('content')

    <h1>{{$post->title}}</h1>
    <div>
        {{$post->content}}

    </div>      
    <p><a href="./storage/app/public/upload/{{$post->file_name}}" download>Download the pdf</a></p>
    <small>Written on {{$post->created_at}}</small>
     <a href="/posts" class="btn btn-default">Return</a>

@endsection

Migration Create Post

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->mediumText('content');
            $table->string('file_name')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

storage/app/public is not visible to the user

You need to either move to public/... and/or create a symbolic link using this instructions: https://laravel.com/docs/5.7/filesystem#the-public-disk

php artisan storage:link

Then you replace

<a href="./storage/app/public/upload/{{$post->file_name}}" download>

With

<a href="{{asset('storage/upload/'.$post->file_name)}}" download>