Я пытаюсь создать 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 для скрытия действительного идентификатора. А в остальном очень простое кодирование, я делюсь кодом роутера / контроллера / представлений и рад поделиться еще!
Заранее большое спасибо!