<div id="encryptedLinksBlock" style="margin-top: 20px;">
<div class="file-info" style="margin-bottom: 10px;">
<h2 style="color: #222222; margin-bottom: 10px;">Результаты:</h2>
<div id="encryptedLinksContainer"></div>
</div>
</div>
<script>
function limitFiles(input) {
if (input.files.length > 20) {
alert("Можно загрузить не более 20 изображений.");
input.value = '';
}
}
function submitForm() {
const form = document.getElementById('uploadForm');
if (form && form.checkValidity()) {
form.submit();
}
}
function copyAllLinks() {
const links = document.querySelectorAll("#imageLinks a");
if (!links.length) return;
const allText = Array.from(links).map(link => link.href).join('\n');
const copyBtn = document.getElementById("copyAllButton");
if (!copyBtn) return;
navigator.clipboard.writeText(allText).then(() => {
copyBtn.textContent = "Скопировано!";
copyBtn.disabled = true;
setTimeout(() => {
copyBtn.textContent = "Копировать";
copyBtn.disabled = false;
}, 2000);
}).catch(err => {
console.error('Ошибка копирования:', err);
});
}
function copyGeneralLink() {
const generalLink = document.getElementById("generalLink");
if (!generalLink) return;
const copyBtn = document.getElementById("copyGeneralButton");
if (!copyBtn) return;
navigator.clipboard.writeText(generalLink.href).then(() => {
copyBtn.textContent = "Скопировано!";
copyBtn.disabled = true;
setTimeout(() => {
copyBtn.textContent = "Копировать общую ссылку";
copyBtn.disabled = false;
}, 2000);
}).catch(err => {
console.error('Ошибка копирования:', err);
});
}
function bufToHex(buffer) {
return [...new Uint8Array(buffer)].map(b => b.toString(16).padStart(2, '0')).join('');
}
function hexToBuf(hex) {
const bytes = new Uint8Array(hex.length / 2);
for (let i = 0; i < bytes.length; i++) {
bytes = parseInt(hex.substr(i * 2, 2), 16);
}
return bytes.buffer;
}
async function generateKey() {
return crypto.subtle.generateKey(
{ name: "AES-GCM", length: 128 },
true,
["encrypt", "decrypt"]
);
}
async function encryptFile(file) {
const key = await generateKey();
const rawKey = await crypto.subtle.exportKey("raw", key);
const keyHex = bufToHex(rawKey);
const iv = crypto.getRandomValues(new Uint8Array(12));
const ivHex = bufToHex(iv.buffer);
const arrayBuffer = await file.arrayBuffer();
const encrypted = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv: iv },
key,
arrayBuffer
);
const combined = new Uint8Array(iv.byteLength + encrypted.byteLength);
combined.set(iv, 0);
combined.set(new Uint8Array(encrypted), iv.byteLength);
return {
blob: new Blob([combined], { type: "application/octet-stream" }),
keyHex
};
}
const modeSwitch = document.getElementById('modeSwitch');
const uploadInput = document.querySelector('input[type="file"]');
const uploadForm = document.getElementById('uploadForm');
const encryptedUploadUrl = '/upload_encrypted';
function limitFiles(input) {
if (input.files.length > 20) {
alert("Можно загрузить не более 20 изображений.");
input.value = '';
}
}
uploadInput.addEventListener('change', async function(e) {
limitFiles(this);
if (!modeSwitch.checked) {
uploadForm.submit();
return;
}
const files = e.target.files;
if (files.length === 0) return;
const encryptedLinks = [];
for (const file of files) {
try {
const { blob, keyHex } = await encryptFile(file);
const formData = new FormData(uploadForm);
formData.set('file', blob, file.name + '.encrypted');
const response = await fetch(encryptedUploadUrl, {
method: uploadForm.method,
body: formData,
});
const data = await response.json();
if (data.id) {
const link = `${window.location.origin}/x/${data.id}#${keyHex}`;
encryptedLinks.push(link);
} else {
alert(`Ошибка загрузки файла ${file.name}`);
}
} catch (err) {
alert(`Ошибка загрузки файла ${file.name}: ${err.message}`);
}
}
if (encryptedLinks.length > 0) {
displayEncryptedLinks(encryptedLinks);
}
});
function displayEncryptedLinks(links) {
const encryptedLinksContainer = document.getElementById('encryptedLinksContainer');
const encryptedLinksBlock = document.getElementById('encryptedLinksBlock');
encryptedLinksContainer.innerHTML = '';
if (links.length > 0) {
encryptedLinksBlock.style.display = 'block';
} else {
encryptedLinksBlock.style.display = 'none';
}
links.forEach(link => {
const linkElement = document.createElement('a');
linkElement.href = link;
linkElement.target = '_blank';
linkElement.textContent = link;
encryptedLinksContainer.appendChild(linkElement);
encryptedLinksContainer.appendChild(document.createElement('br'));
});
}
Там сотрудники чётко по инструкциям действуют, на неизвестные ссылки и хостиги не перехродят.