Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Вот такая вот ошибка при чем вот мои данные, как ее победить?
токен
<meta name="csrf-token" content="{{ csrf_token() }}" />
<input type="hidden" name="_token" value="{{ csrf_token() }}">
$.ajaxSetup({
headers:{
'X-CSRF-TOKEN':$('meta[name="csrf-token"]').attr('content')
}
})
VerifyCsrfToken.php
<?php
namespace App\Http\Middleware ;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Closure;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next){
return parent::handle($request, $next);
}
/**
* Determine if the session and input CSRF tokens match.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function tokensMatch($request)
{
// If request is an ajax request, then check to see if token matches token provider in
// the header. This way, we can use CSRF protection in ajax requests also.
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');
return $request->session()->token() == $token;
}
}
Роут
Route::post('/functions_images', 'FunctionsController@index');
Контроллер
class FunctionsController extends Controller
{
//
public function __construct(){
$this->middleware('guest');
}
public function index(Request $request){
if ($request->ajax()) {
dump($request->input());
$array=$request->input();
var_dump($array);
}
}
}
Не в сети
Не в сети
Я не могу решить эту проблему что тут можно еще просмотреть, может кто то может вызватьс реально помочь,
при отправке изображения меняется Ларавель сессия во вкладке Network вродебы токен прописан , как таковой формы нет там яваскрипт код отправляет изображение, помогите пожалуйста реально если кто то сталкивался или разбирается хорошо
Изменено imediasun (17.02.2017 14:10:06)
Не в сети
1) Почему ты решил что меняется Ларавель сессия?
2) Покажи во вкладке нет что отправляется в заголовках при отправке картинки
3) Какой текст ошибки?
Изменено DBR (17.02.2017 14:39:07)
Не в сети
текст ошибки после отправки картинки http://prntscr.com/e9vhgo
загаловки http://prntscr.com/e9vha6
сессия до отправки http://prntscr.com/e9vhrc
сессия после отправки картинки
Не в сети
Судя по картинке с заголовками, нет там X-CSRF-TOKEN.
Каким скриптом загружаете картинку?
Осмелюсь предположить, что вы картинку отправляете каким-то сторонним загрузчиком, который не использует jQuery ajax.
Потому и $.ajaxSetup не работает.
Если это так, то смотрите документацию скрипта и ищите как добавить заголовки.
Не в сети
Судя по картинке с заголовками, нет там X-CSRF-TOKEN.
Да, видно что заголовок не используется. Видно что есть кука с очень походим названием, но это не то. На нее обращать внимание не надо.
Не в сети
Как варианта можно не мучаться с заголовком а добавить гет-параметр к урл с токеном.
Не в сети
Как варианта можно не мучаться с заголовком а добавить гет-параметр к урл с токеном.
Напишите пожалуйста как это должно выглядеть?
Не в сети
Здесь http://boomer.imedia.in.ua прописан токен через $.ajaxSetup
но работает только после повторного нажатия на кнопку register срабатывает, тогда появляется токен в адресной строке, почему? попробуйте
хотя в куках тоже присутствует XSRF-TOKEN http://prntscr.com/ea9zrh
как и в том варианте с фотографией, тут я записал следующим образом
VerifyCsrfToken.php
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Closure;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
// говорят вот тут необходимо адресс url указывать но я пробывал тот же эффект что и не указывать
];
public function handle($request, Closure $next){
return parent::handle($request, $next);
}
/**
* Determine if the session and input CSRF tokens match.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function tokensMatch($request)
{
// If request is an ajax request, then check to see if token matches token provider in
// the header. This way, we can use CSRF protection in ajax requests also.
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');
return $request->session()->token() == $token;
}
}
Изменено imediasun (18.02.2017 14:44:38)
Не в сети
Отключи проверку на CSRF. Это будет еще проще
Не в сети
Отключи проверку на CSRF. Это будет еще проще
Да в этом случае я отключил и работает, а что делать в случае с фотографией?
TokenMismatchException in VerifyCsrfToken.php line 68:
Изменено imediasun (18.02.2017 17:07:02)
Не в сети
Как варианта можно не мучаться с заголовком а добавить гет-параметр к урл с токеном.
Привидите пример пожалуйста
Не в сети
Опишите лучше проблему. Что делаете, чего хотите добиться и т.д., а также выложите файлы из проекта:
- файл роутов
- вьюху с которой отправляете фото,
-файл контролера
- js файл, где описывается метод отправки фото
Иначе ничего не понятно, задача по идее элементарная...
Не в сети
Вот адрес проекта http://industry.imedia.in.ua/admin/add_good
Вот роут
Route::post('/functions_images', 'FunctionsController@index');
Вот Контроллер
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FunctionsController extends Controller
{
//
public function __construct(){
$this->middleware('guest');
}
public function index(Request $request){
if ($request->ajax()) {
dump($request->input());
}
}
}
Вот VerifyCsrfToken.php
<?php
namespace App\Http\Middleware ;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Closure;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
"industry.loc/admin/add_good"
];
public function handle($request, Closure $next){
return parent::handle($request, $next);
}
/**
* Determine if the session and input CSRF tokens match.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function tokensMatch($request)
{
// If request is an ajax request, then check to see if token matches token provider in
// the header. This way, we can use CSRF protection in ajax requests also.
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token');
return $request->session()->token() == $token;
}
}
Вот мой файл вида это многоуровневая форма потому текста много,
но проблема возникает до сабмита формы, когда на одном из уровней
я пытаюсь загрузить фотографию через
jquery.fileupload
<div class="boxed">
<!--CONTENT CONTAINER-->
<!--===================================================-->
<div id="content-container">
<!--Page Title-->
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<div class="pageheader">
<h3><i class="fa fa-home"></i> Forms Wizard </h3>
<div class="breadcrumb-wrapper"> <span class="label">You are here:</span>
<ol class="breadcrumb">
<li> <a href="#"> Home </a> </li>
<li class="active"> forms wizard </li>
</ol>
</div>
</div>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<!--End page title-->
<!--Page content-->
<!--===================================================-->
<div id="page-content">
<div class="row">
<div class="col-md-12">
<section class="panel">
<div class="panel-heading">
<h3 class="panel-title"> Додати товар </h3>
</div>
<div class="panel-body">
<!-- START Form Wizard -->
<form class="form-horizontal form-bordered" action="#" id="wizard">
<!-- Wizard Container 1 -->
<div class="wizard-title"> Інформація о товарі </div>
<div class="wizard-container">
<div class="form-group">
<div class="col-md-12">
<h4 class="text-primary"> <i class="fa fa-sign-in"></i> Основна фнформація </h4>
<p class="text-muted"> Інформація яка вноситься до бази данних </p>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"> Назва товару : </label>
<div class="col-sm-6">
<input class="form-control" name="name" type="text" placeholder="Введить назву" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"> Артикул : </label>
<div class="col-sm-6">
<input class="form-control" name="artikul" type="text" placeholder="Введить артикул" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"> Категорія : </label>
<div class="col-sm-6">
<select class="form-control" name="category" placeholder="Виберить категорію" />
<option>123</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"> Тип : </label>
<div class="col-sm-6">
<select class="form-control" name="type" placeholder="Виберить тип товару" />
<option>123</option>
</select>
</div>
</div>
<div class=" form-group ">
<label class="col-sm-2 control-label"> Ціна : </label>
<div class="col-sm-6 input-group mar-btm">
<span class="input-group-addon"><i class="fa fa-dollar fa-lg"></i></span>
<input class="form-control" type="text">
<span class="input-group-addon">.00</span>
</div>
</div>
</div>
<!--/ Wizard Container 1 -->
<!-- Wizard Container 2 -->
<div class="wizard-title"> Опис характеристика товару </div>
<div class="wizard-container">
<div class="form-group">
<div class="col-md-12">
<h4 class="semibold text-primary"> <i class="fa fa-user"></i> Опис товару </h4>
<p class="text-muted"> Характеристика </p>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Опис товару: <span class="text-danger">*</span> </label>
<textarea name="editor1"></textarea>
<script>
CKEDITOR.replace( 'editor1' );
</script>
</div>
</div>
</div>
</div>
<!--/ Wizard Container 2 -->
<!-- Wizard Container 3 -->
<div class="wizard-title"> Фото товару </div>
<div class="wizard-container">
<div id="appl_window">
<div id="close_window" class="del_prod_btn"></div>
<div id="add_photo">
<br>
<h6>Выберите
<?
$count_images=5;
$image_width=1200;
$image_height=800;
$image_type='logo';
$image_index=1;
echo $count_images;
if($count_images==1){
echo "фотографию";
}
else if($count_images>1 && $count_images<5){
echo "фотографии";
}
else if($count_images>4){
echo "фотографий";
}
?>
(не более 2М)
<?=$image_width?>х<?=$image_height?>px -
<?if($image_type=='logo'){
echo "логотип данного производителя";
}
else if($image_type=='door'){
echo "фотографии выбранной двери";
}
else if($image_type=='material' or $image_type=='material_edit'){
echo "фотографии материала";
}
?>
</h6>
<label>Фотография*<span> Чтобы добавить картинку, нажми обзор или просто перетащи в желтую область ниже ⇓<hr></span></label>
<br>
<input type="file" name="my-pic[]" id="file-field3" class="image" multiple="multiple"/>
<a id="cancel-all3">Отменить все</a>
<div id="img-container3">
<ul id="img-list3"></ul>
</div>
<div id="leftpanel">
<div id="actions">
<input type="hidden" name="lwidth" value="<?=$image_width?>">
<input type="hidden" name="lheight" value="<?=$image_height?>">
<input type="hidden" name="lproducers" value="/upload">
<input type="hidden" name="ltype" value="<?=$image_type?>">
<span id="info-count">Изображений не выбрано</span><br/>
Общий размер:<span id="info-size">0</span> Кб<br/><br/>
</div>
<div id="console3"></div>
<div class="apply_btn"></div>
</div>
</div>
</div>
<!------------------------------------------------------------------------------------------------------------------>
<!---НАЧАЛАСЬ ЗАГРУЗКА ФОТОГРАФИЙ-------------------->
<!------------------------------------------------------------------------------------------------------------------>
<script>
$(document).ready(function() {
// Консоль
var $console = $("#console3");
// Инфа о выбранных файлах
var countInfo = $("#info-count");
var sizeInfo = $("#info-size");
// ul-список, содержащий миниатюрки выбранных файлов
var imgList = $('#img-list3');
// Контейнер, куда можно помещать файлы методом drag and drop
var dropBox = $('#img-container3');
// Счетчик всех выбранных файлов и их размера
var imgCount = 0;
var imgSize = 0;
// Стандарный input для файлов
var fileInput = $('#file-field3');
// Тестовый canvas
/* var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(128,128,128)";
ctx.fillRect (0, 0, 150, 150);
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect (30, 30, 55, 50); */
////////////////////////////////////////////////////////////////////////////
// Подключаем и настраиваем плагин загрузки
fileInput.damnUploader({
// куда отправлять
url: '/functions_images',
// имитация имени поля с файлом (будет ключом в $_FILES, если используется PHP)
fieldName: 'my-pic',
// дополнительно: элемент, на который можно перетащить файлы (либо объект jQuery, либо селектор)
dropBox: dropBox,
// максимальное кол-во выбранных файлов (если не указано - без ограничений)
limit: <?echo $count_images?>,
// когда максимальное кол-во достигнуто (вызывается при каждой попытке добавить еще файлы)
onLimitExceeded: function() {
log('Допустимое кол-во файлов уже выбрано');
},
// ручная обработка события выбора файла (в случае, если выбрано несколько, будет вызвано для каждого)
// если обработчик возвращает true, файлы добавляются в очередь автоматически
onSelect: function(file) {
addFileToQueue(file);
return false;
},
// когда все загружены
onAllComplete: function() {
log('<span style="color: blue;">*** Все загрузки завершены! ***</span>');
imgCount = 0;
imgSize = 0;
updateInfo();
}
});
////////////////////////////////////////////////////////////////////////////
// Вспомогательные функции
// Вывод в консоль
function log(str) {
$('<p/>').html(str).prependTo($console);
}
// Вывод инфы о выбранных
function updateInfo() {
countInfo.text( (imgCount == 0) ? 'Изображений не выбрано' : ('Изображений выбрано: '+imgCount));
sizeInfo.text( (imgSize == 0) ? '-' : Math.round(imgSize / 1024));
}
// Обновление progress bar'а
function updateProgress(bar, value) {
var width = bar.width();
var bgrValue = -width + (value * (width / 100));
bar.attr('rel', value).css('background-position', bgrValue+'px center').text(value+'%');
}
// преобразование формата dataURI в Blob-данные
function dataURItoBlob(dataURI) {
var BlobBuilder = (window.MSBlobBuilder || window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder);
if (!BlobBuilder) {
return false;
}
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs
var pieces = dataURI.split(',');
var byteString = (pieces[0].indexOf('base64') >= 0) ? atob(pieces[1]) : unescape(pieces[1]);
// separate out the mime component
var mimeString = pieces[0].split(':')[1].split(';')[0];
// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var z = 0; z < byteString.length;z++) {
ia[z] = byteString.charCodeAt(i);
}
// write the ArrayBuffer to a blob, and you're done
var bb = new BlobBuilder();
bb.append(ab);
return bb.getBlob(mimeString);
}
// Отображение выбраных файлов, создание миниатюр и ручное добавление в очередь загрузки.
function addFileToQueue(file) {
// Создаем элемент li и помещаем в него название, миниатюру и progress bar
var li = $('<li/>').appendTo(imgList);
/* var title = $('<div/>').text(file.name+' ').appendTo(li); */
var cancelButton = $('<a/>').attr({
href: '#cancel',
title: 'отменить'
}).html('<img height="15" width="15" alt="X" src="/img/deleteIcon.png">').appendTo(/* title */li);
// Если браузер поддерживает выбор файлов (иначе передается специальный параметр fake,
// обозночающий, что переданный параметр на самом деле лишь имитация настоящего File)
if(!file.fake) {
// Отсеиваем не картинки
var imageType = /video.*/;
var imageType2 = /image.*/;
if (!file.type.match(imageType) && !file.type.match(imageType2)) {
log('Файл отсеян: `'+file.name+'` (тип '+file.type+')');
return true;
}
// Добавляем картинку и прогрессбар в текущий элемент списка
var div = $('<div/>').addClass('photo_frame').attr('rel', '0').appendTo(li);
var img = $('<img/>').appendTo(li);
/* var pBar = $('<div/>').addClass('progress').attr('rel', '0').text('0%').appendTo(li); */
// Создаем объект FileReader и по завершении чтения файла, отображаем миниатюру и обновляем
// инфу обо всех файлах (только в браузерах, подерживающих FileReader)
if($.support.fileReading) {
var reader = new FileReader();
reader.onload = (function(aImg) {
return function(e) {
aImg.attr('src', e.target.result);
aImg.attr('height', 100);
};
})(img);
reader.readAsDataURL(file);
}
log('Картинка добавлена: `'+file.name + '` (' +Math.round(file.size / 1024) + ' Кб)');
imgSize += file.size;
} else {
log('Файл добавлен: '+file.name);
}
imgCount++;
updateInfo();
// Создаем объект загрузки
var uploadItem = {
file: file,
/* onProgress: function(percents) {
updateProgress(pBar, percents);
}, */
onComplete: function(successfully, data, errorCode) {
if(successfully) {
log('Файл `'+this.file.name+'` загружен, полученные данные:<br/>*****<br/>'+data+'<br/>*****');
} else{
if(!this.cancelled) {
log('<span style="color:red;">Файл `'+this.file.name+'`: ошибка при загрузке. Код: '+errorCode+'</span>');
}
}
}
};
// ... и помещаем его в очередь
var queueId = fileInput.damnUploader('addItem', uploadItem);
// обработчик нажатия ссылки "отмена"
cancelButton.click(function() {
fileInput.damnUploader('cancel', queueId);
li.remove();
imgCount--;
imgSize -= file.fake ? 0 : file.size;
updateInfo();
log(file.name+' удален из очереди');
return false;
});
return uploadItem;
}
////////////////////////////////////////////////////////////////////////////
// Обработчики событий
// Обработка событий drag and drop при перетаскивании файлов на элемент dropBox
dropBox.bind({
dragenter: function() {
$(this).addClass('highlighted');
return false;
},
dragover: function() {
return false;
},
dragleave: function() {
$(this).removeClass('highlighted');
return false;
}
});
// Обаботка события нажатия на кнопку "Загрузить все".
// стартуем все загрузки
$(".apply_btn").click(function() {
fileInput.damnUploader('startUpload');
});
// Обработка события нажатия на кнопку "Отменить все"
$("#cancel-all3").click(function(){
fileInput.damnUploader('cancelAll');
imgCount = 0;
imgSize = 0;
updateInfo();
log('*** Все загрузки отменены ***');
imgList.empty();
});
// Обработка нажатия на тестовую канву
/* $(canvas).click(function() {
var blobData;
if (canvas.toBlob) {
// ожидается, что вскоре браузерами будет поддерживаться метод toBlob() для объектов Canvas
blobData = canvas.toBlob();
} else {
// ... а пока - конвертируем вручную из dataURI
blobData = dataURItoBlob(canvas.toDataURL('image/png'));
}
if (blobData === false) {
log("Ваш браузер не поддерживает BlobBuilder");
return ;
}
addFileToQueue(blobData)
}); */
////////////////////////////////////////////////////////////////////////////
// Проверка поддержки File API, FormData и FileReader
if(!$.support.fileSelecting) {
log('Ваш браузер не поддерживает выбор файлов (загрузка будет осуществлена обычной отправкой формы)');
$("#dropBox-label").text('если бы ты использовал хороший браузер, файлы можно было бы перетаскивать прямо в область ниже!');
} else {
if(!$.support.fileReading) {
log('* Ваш браузер не умеет читать содержимое файлов (миниатюрки не будут показаны)');
}
if(!$.support.uploadControl) {
log('* Ваш браузер не умеет следить за процессом загрузки (progressbar не работает)');
}
if(!$.support.fileSending) {
log('* Ваш браузер не поддерживает объект FormData (отправка с ручной формировкой запроса)');
}
log('Выбор файлов поддерживается');
}
log('*** Проверка поддержки ***');
});
</script>
<!------------------------------------------------------------------------------------------------------------------>
<!---ЗАКОНЧИЛАСЬ ЗАГРУЗКА ФОТОГРАФИЙ-------------------->
<!------------------------------------------------------------------------------------------------------------------>
</div>
<!--/ Wizard Container 3 -->
<!-- Wizard Container 4 -->
<div class="wizard-title"> Відео товару </div>
<div class="wizard-container">
<div class="form-group">
<div class="col-md-12">
<h4 class="semibold text-primary"> <i class="fa fa-cog"></i> Work experience </h4>
<p class="text-muted"> Let us know about your work experience </p>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label>Company: </label>
<input type="text" name="Work experience" class="form-control" placeholder="Work experience" />
</div>
<div class="col-md-6">
<label> Country: </label>
<input type="text" name="Country" class="form-control" placeholder="Choose a Country" />
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-md-6">
<label> Position: </label>
<input type="text" name="Your Position" class="form-control" placeholder="Your Position" />
</div>
<div class="col-md-3">
<label> From: </label>
<div class="row">
<div class="col-sm-8">
<select name="month" class="form-control">
<option value="">Month</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
</div>
<div class="col-sm-4">
<input type="text" name="University-Country" class="form-control" placeholder="Year" />
</div>
</div>
</div>
<div class="col-md-3">
<label> To: </label>
<div class="row">
<div class="col-sm-8">
<select name="month" class="form-control">
<option value="">Month</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
</div>
<div class="col-sm-4">
<input type="text" name="University-Country" class="form-control" placeholder="Year" />
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Wizard Container 4 -->
</form>
<!--/ END Form Wizard -->
</div>
</section>
</div>
</div>
</div>
<!--===================================================-->
<!--End page content-->
</div>
<!--===================================================-->
<!--END CONTENT CONTAINER-->
</div>
Изменено imediasun (19.02.2017 16:33:23)
Не в сети
Ваш damnUploader не отправляет никакие кастомные заголовки, в том числе и не отправляет X-Requested-With (Ну вот так задумал автор)
Если вы загружаете что-то этим аплоадером, то проверять на if ($request->ajax()) нельзя, - всегда будет false.
Можно поступить по варварски
Не забываем в хедере указать токен <meta name="csrf-token" content="{{ csrf_token() }}" />
Заходите в файл jquery.damnuploader.js и на 279 строке, после xhr.open("POST", url); вставляете
xhr.setRequestHeader('X-CSRF-TOKEN', $('meta[name="csrf-token"]').attr('content'));
Если хотите на сервере проверять на ajax, то тогда нужно еще добавить строчку
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
---
Сохраняете. Чистите кеш браузера. Пробуете
Не в сети
надо отдать должное skiphog, я когда увидел эту портянку – пролистнул не читая. нужна определённая усидчивость и искреннее желание помочь, чтобы посидеть и потратить время на разбор всего этого добра
Не в сети
Да спасибо большое за искренное желание помочь и за усидчивость но я выполнил как вы сказали и все равно
TokenMismatchException in VerifyCsrfToken.php line 68:
Может дело действительно в том что есть еще и XSRF-Token если можно свяжитесь по скайпу может нагляднее получится помочь, весьма благодарен за помощь СКАЙП imediasun Очень насущная проблема
Изменено imediasun (19.02.2017 19:17:23)
Не в сети
Все решено спасибо Алексею
Не в сети
Страницы 1