не нужна такая запутанная дичь )))
Ну а если в сессию записать id пользователя полученный при авторизации, и далее работать только с ним, со стороны безопасности это нормально?
set NODE
строку NODE_SKIP_PLATFORM_CHECK=1
?npm config ls -l
prefix = "C:\\Users\\alpeg\\AppData\\Roaming\\npm"
Не совсем лирическое отступление. Через некоторое время этот шаг не понадобится, но сейчас, пока не вышла новая версия в которой уже есть NODE_SKIP_PLATFORM_CHECK , на шаге 4 надо вместо обычной страницы загрузок скачать nightly-версию отсюда:
https://nodejs.org/download/nightly/
Жмем Ctrl+F, и ищем сегодняшную дату в формате ГГГГММДД (20200620), если такой нет - ищем вчерашнюю.
Внутри берём 7z или zip архив нужной разрядности
мне подошла папка "v15.0.0-nightly20200620fdf10adef8", файл "node-v15.0.0-nightly20200620fdf10adef8-win-x64.7z"
node --version
, потом npm config ls -l
npm config set prefix "C:\Users\alpeg\AppData\Roaming\npm"
npm list -g --depth=0 2>/dev/null
, затем запустив команду npm i -g package1 package2 package3 ...
чтобы их все переустановить.npm install -g windows-build-tools
(внимательно читаем вывод, может потребоваться пляска с бубном - но там будет написана инструкция что делать). После танцев с бубном можно попробовать пакеты снова canvas.toBlob(function (blob) { ... }, 'image/jpeg', 0.95);
echo "\$_POST: \n";
print_r($_POST);
echo "\n\$_FILES: \n";
print_r($_FILES);
<style type="text/css">
#пикчи {display:flex;flex-flow:row wrap;}
#пикчи > div > img {max-width: 100px;max-height:100px;width:auto;height:auto;}
</style>
<form action="" method="POST" id="form1">
Имя: <input type="text" name="myname" placeholder="Вася" required>
<br>Отзыв: <input type="text" name="mytext" placeholder="Чипсы понравились!" required>
<br>Пикчи: <input type="file" id="uploadItem"/>
<div>
Пикчи:
<div id="пикчи">
</div>
</div>
<button type="submit" id="form1sbm">go</button>
<pre id="result"></pre>
</form>
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script type="text/javascript">
// https://qna.habr.com/q/787649
$(document).ready(function () {
$('#uploadItem').change(function () {
$.each(this.files, function (i, file) {
storeResized(file);
});
$('#uploadItem').val('');
});
var form1 = $('#form1');
var form1sbm = $('#form1sbm');
form1.submit(function (event) {
event.preventDefault();
if (form1sbm.is(':disabled')) {
return;
}
var valid = form1[0].reportValidity();
if (!valid) {
return;
}
var data = new FormData();
// вручную добавляем элементы формы (с чекбоксами всё по-другому)
data.append("myname", $('#form1 input[name="myname"]').val());
data.append("mytext", $('#form1 input[name="mytext"]').val());
$.each(imagesStorage, function (i, v) {
data.append("pics[]", v.blob, v.name);
});
// // вариант 1 (если blob был получен из canvas.toBlob(), то он уже будет иметь правильный mime-тип)
// data.append("file_field_blob", blob, "filename1.ext");
// // вариант 2
// data.append("file_field_file_1", new File([blob], "filename2.ext", {type: 'image/jpeg'}), "filename1.ext");
// // или так
// data.append("file_field_file_2", new File([blob], "filename2.ext", {type: 'image/jpeg'}));
var request = new XMLHttpRequest();
form1sbm.attr('disabled', true);
request.onerror = function () {
// show error?
$('#result').text(this.response);
form1sbm.attr('disabled', false);
};
request.onload = function () {
if (this.status >= 200 && this.status < 400) {
$('#result').text(this.response);
form1sbm.attr('disabled', false);
imageRemoveAll();
} else {
// show error?
$('#result').text(this.response);
form1sbm.attr('disabled', false);
}
};
request.open("POST", "1.php");
request.send(data);
});
var imagesStorage = [];
var пикчи = $('#пикчи');
function imageRemoveAll() {
while (imagesStorage.length > 0) {
imageRemove(0);
}
пикчи.text('');
}
function imageRemove(index) {
var removed = imagesStorage.splice(index, 1)[0];
URL.revokeObjectURL(removed.localUrl);
delete removed.blob;
}
пикчи.on('click', '.pics-del', function (event) {
event.preventDefault();
var pic = $(this).closest('.pics-pic');
imageRemove(pic.index());
pic.remove();
});
function imageAdd(blob, name) {
var o = {blob: blob, name: name, localUrl: URL.createObjectURL(blob)};
imagesStorage.push(o);
var div = $('<div class="pics-pic">');
$('<div></div>').text(name + ' ').append($('<button type="button" class="pics-del">×</button>')).appendTo(div);
$('<div></div>').append($('<img>').attr('src', o.localUrl)).appendTo(div)
div.appendTo(пикчи);
}
function lol2() {
$('#uploadItem2')[0].files
}
function storeResized(file) {
// будем использовать также file.type, file.name
var reader = new FileReader();
reader.onload = function () {
var arrayBuffer = reader.result;
// File может быть использован вместо Blob!
// var blob = new Blob([arrayBuffer], {type: file.type});
var blob = new File([arrayBuffer], file.name, {type: file.type});
var imageUrl = URL.createObjectURL(blob);
var once = false;
var maxWidth = 1000;
var tempImg = new Image();
tempImg.src = imageUrl;
tempImg.onerror = function () {
if (once) {
return;
}
once = true;
URL.revokeObjectURL(imageUrl);
delete arrayBuffer;
delete blob;
};
tempImg.onload = function () {
if (once) {
return;
}
once = true;
var tempW = tempImg.width;
var tempH = tempImg.height;
if (tempW > tempH) {
if (tempW > maxWidth) {
tempH *= maxWidth / tempW;
tempW = maxWidth;
}
} else {
if (tempH > maxWidth) {
tempW *= maxWidth / tempH;
tempH = maxWidth;
}
}
tempW = Math.round(tempW);
tempH = Math.round(tempH);
var canvas = document.createElement('canvas');
canvas.width = tempW;
canvas.height = tempH;
var ctx = canvas.getContext("2d");
ctx.drawImage(this, 0, 0, tempW, tempH);
canvas.toBlob(function (blob) {
imageAdd(blob, file.name);
}, 'image/jpeg', 0.95);
this.src = '';
URL.revokeObjectURL(imageUrl);
delete arrayBuffer;
delete blob;
};
};
reader.readAsArrayBuffer(file);
}
});
</script>
при изменении change() input file на мою страницу действительно приходит массив $_FILES, но при отправке формы он ведь теряется...
Я думал через js/canvas их сжать и потом вместе с отправкой формы обрабатывать уже через Imagick.
у яндекса слжнее, но тоже можно.
а сервис про то что "автоматически принимаешь платежи без комиссии " врёт. у них есть платный тариф. это значит, что это вроде бы и без комиссии, но зато сервис "условно бесплатный".
То есть рано или поздно ты не сможешь принять платёж так как надо заплатить.