Код Laravel работает только если открытые devtools - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать URL-адрес, который может ограничить количество загрузок определенным числом, указанным во входных данных count_url , а также срок действия ссылки / URL-адреса должен истечь через определенное время (возможно, 1 или 2). мин)

Для временного URL, когда я использовал ( временныйSignedRoute ), он работает нормально. Чтобы контролировать количество кликов по ссылке, я написал некоторый код (в основном, это коллекция из разных мест, так как я очень плохо знаком с Laravel и программированием), который удивительно работает, если открыты devtools и обновляются базы данных. на каждый клик. Вскоре вы достигнете максимального числа, которое говорит о том, что вы превысили предел! Хорошо.

Но очень досадно, когда вы закрываете devtools , это не работает, только обновляет базу данных в первый раз, после чего она позволяет загружать файл, но не обновляетТаким образом, база данных не тормозит, и ее можно скачать без ограничений. Логика очень проста и всего лишь из нескольких строк, если кто-то может мне в этом помочь, я буду очень благодарен!

Я хочу, чтобы это работало с / без открытых devtools.

При обновленииКнопка / назад, она не должна обновлять (временныйSignedRoute), скорее ссылка / URL должна оставаться там же навсегда или до тех пор, пока кто-то не закроет страницу.

---- index.blade.php ----

<a href="{{ route('models.create') }}" class="btn btn-primary">Add new Models ss</a>
<br />
<table style="width:100%">                
    <tr>
        <th scope="col">Title</th>
        <th scope="col">Image</th>
        <th scope="col">No. of minutes</th>
        <th scope="col">Download file</th>
    </tr>
    @forelse($canaanmodels as $canaanmodel)
    <tr>
        <td >{{ $canaanmodel->title }}</td>
        <td > <img src= "canaanmodels/{{ $canaanmodel->img_name }}" class="img" height="80" width="100"> </td>
        <!-- <td> {{ $canaanmodel->photo ? $canaanmodel->photo->file : "image not found" }} </td> -->
        <td halign="bottom">
            <?php
            $user = Auth::user();
            $path_email = route('models.download', $canaanmodel->uuid);                                          
            ?>
            <form action='/display_links' method=post >
                @csrf

                <input name=uuid type=hidden value="{{$canaanmodel->uuid}}">
                <input name="link_to_email" value="{{$path_email}}" type="hidden">
                <input class="num_input" type=number name=count_url min=1 max=5 required>
                <input class="sub_input" type=submit value = "Download Link" class="btn btn-primary" style="float: right">
            </form>   
            <form action='/payment' method=post>
                @csrf

                <input name=uuid type=hidden value="{{$canaanmodel->uuid}}">
                <input name="link_to_email" value="{{$path_email}}" type="hidden">
                <input type=submit value = " BUY ME" class="btn btn-primary" style="float: right;">
            </form>
            <form action='/home' method=get>
                @csrf        
                <input type=submit value = " BUY ME" class="btn btn-primary" style="float: right;">
            </form>
        </td>   
    </tr>
    @empty
    <tr>
        <td colspan="2">No Models found.</td>
    </tr>
@endforelse
</table> 

---- shop.blade.php ----

<body>
    <button id="{{ $temp_url }}" name= "{{ $count }}" onclick="refresh_page(this.id, this.name)" target="_blank">
      Download
    </button>
     <script>
      function refresh_page(val,nam) {
          if (document.getElementById(val).style.color != "red")
            {
              location.href=(val);
              document.getElementById(val).style.color = "red";
            } else if (document.getElementById(val).style.color == "red"){
              location.href=(val);
              document.getElementById(val).style.color = "green";
      } 
    </script>

---- Маршруты ----

Route::resource('/models', 'CanaanController');
Auth::routes();
Route::get('/models/{uuid}/download', 'CanaanController@download')->name('models.download')->middleware('signed');
Route::post('display_links', 'CanaanController@display_link');

---- CanaanController ----

public function index() {
        $canaanmodels = Canaanmodel::all();
        return view('canaanmodels.index', compact('canaanmodels'));
    } 
    public function create() {
        return view('canaanmodels.create');
    }
    public function store(Request $request) {
        $canaanmodel = $request->all();
        $canaanmodel['uuid'] = (string)Uuid::generate();
        if ($request->hasFile('cover')) {
            $canaanmodel['cover'] = $request->cover->getClientOriginalName();
            $request->cover->storeAs('canaanmodels', $canaanmodel['cover']);
        }
        Canaanmodel::create($canaanmodel);
        return redirect()->route('models.index');
    }
    public function download($uuid, Request $request) {
            if (! $request->hasValidSignature()) {
                echo "URL expired";
         }
        else {
            $canaanmodel = Canaanmodel::where('uuid', $uuid)->firstOrFail();
            $user = Auth::user();
            $count = $user->download_count;
            $pathToFile = storage_path('app/canaanmodels/' .$canaanmodel->cover);
            if($count != 0) {
                $count = $count - 1;
                \DB::table('users')->where('email', $user->email)->update(['download_count'=>$count]);
                return response()->download($pathToFile); 
            }
            else{
                 echo "You exceeded your limit";
            }
        }   
    }

    public function display_link(Request $request) {
        $count = Input::get('count_url');
        $user = Auth::user();
        $myFlag = $user->flag;
        \DB::table('users')->where('email', $user->email)->update(['download_count'=>$count, 'flag'=> $count]);
        $tempUrl= URL::temporarySignedRoute('models.download',now()->addMinutes(1), ['uuid' => $request->uuid]); 
        return view('shop',['temp_url' => $tempUrl, 'requesty' => $request, 'count' => $count]);
    }

Я пытаюсь добиться того, чтобы ограничить количество загрузок определенным числом, указанным во входных данных count_url . Как только это будет сделано, я постараюсь сделать это с точки зрения администратора / пользователя, где пользователь / клиент может покупать файлы, а администратор может позволить клиенту / пользователю загружать этот файл в течение определенного периода времени, а также определенныхколичество загрузок.

Я использую mysql (используя xampp ), храню файлы в папках storage / app / canaanmodels и использую webpatser /Пакет laravel-uuid для генерации uuid для скрытия действительного идентификатора. А в остальном очень простое кодирование, я делюсь кодом роутера / контроллера / представлений и рад поделиться еще!

Заранее большое спасибо!

1 Ответ

0 голосов
/ 17 октября 2019

1) Мне просто нужно было сказать, чтобы моя функция загрузки в контроллере не кешировала ее, устанавливая заголовки, для этого использовал следующий код:

$headers =[
            'Content-Type' => 'application/text',
            'Cache-Control' => 'no-store, no-cache, must-revalidate, max-age=0',
            'Cache-Control' => 'post-check=0, pre-check=0, false',
             'Pragma' => 'no-cache',                               ];
return response()->file($pathToFile, $headers);

2) Чтобы разобраться с проблемой регенерацииПри обновлении / перезагрузке я получил временную ссылку, я сначала сохранил эту ссылку в базе данных (mysql), а затем отправил ее оттуда. Спасибо всем, кто помогал или пытался мне помочь.

Те же самые решения относятся и к PhP.

Приветствия.

...