Почему не работают гиперссылки для скачивания PDF?(Нет файла) - PullRequest
0 голосов
/ 09 октября 2018

Я разработал систему для создания статей, каждый пост, кроме заголовка и содержимого, содержит возможность загрузки PDF. Имена файлов хранятся в базе данных и пишутся по гиперссылкам, необходимым для загрузки файла. Теперь проблема в том, что когда я хочучтобы скачать файл, он показывает мне ошибку в браузере.Кто-нибудь знает в чем проблема?

База данных

enter image description here

Расположение файлов PDF

enter image description here

результат

enter image description here

Контроллер сообщений

<?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

Миграция Создать сообщение

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');
    }
}

1 Ответ

0 голосов
/ 09 октября 2018

storage/app/public невидим для пользователя

Вам необходимо либо перейти на public/... и / или создать символическую ссылку, используя следующие инструкции: https://laravel.com/docs/5.7/filesystem#the-public-disk

php artisan storage:link

Затем вы заменяете

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

на

<a href="{{asset('storage/upload/'.$post->file_name)}}" download>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...