| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>File Upload</title> |
| <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css"> |
| <style> |
| body { |
| font-family: Arial, sans-serif; |
| text-align: center; |
| background-color: #f0f0f0; |
| margin: 0; |
| padding: 0; |
| } |
| h1 { |
| background-color: #4CAF50; |
| color: white; |
| padding: 20px; |
| margin: 0; |
| border-bottom: 2px solid #388E3C; |
| } |
| button[type="submit"] { |
| color: white; |
| background-color: #4CAF50; |
| border: none; |
| cursor: pointer; |
| padding: 10px 20px; |
| font-size: 16px; |
| border-radius: 5px; |
| margin-top: 20px; |
| } |
| button[type="submit"]:hover { |
| background-color: #388E3C; |
| } |
| #mediaContainer { |
| margin-top: 20px; |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| flex-direction: column; |
| max-width: 100%; |
| height: auto; |
| } |
| #mediaContainer img, #mediaContainer video { |
| max-width: 100%; |
| height: auto; |
| object-fit: contain; |
| } |
| #imageUrl { |
| margin-top: 20px; |
| font-size: 16px; |
| color: #333; |
| cursor: pointer; |
| text-decoration: underline; |
| } |
| #progressBarContainer { |
| width: 80%; |
| margin: 20px auto; |
| background-color: #ddd; |
| border-radius: 13px; |
| padding: 3px; |
| } |
| #progressBar { |
| width: 0%; |
| height: 20px; |
| background-color: #4CAF50; |
| border-radius: 10px; |
| text-align: center; |
| line-height: 20px; |
| color: white; |
| } |
| </style> |
| </head> |
| <body> |
| <h1>Отправка сообщения (текст + файл) с рандомизацией</h1> |
| <div id="mediaContainer"> |
| |
| </div> |
| <div id="progressBarContainer"> |
| <div id="progressBar">0%</div> |
| </div> |
| <div id="imageUrl" onclick="copyToClipboard(this)">Кликните после загрузки, если нужна ссылка на сохранённый файл.</div> |
| <form id="uploadForm" enctype="multipart/form-data" method="post" action="/upload"> |
| <input type="file" name="file"> |
| <button type="submit">Загрузить</button> |
| </form> |
| <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script> |
| <script> |
| document.getElementById('uploadForm').addEventListener('submit', function(event) { |
| event.preventDefault(); |
| var formData = new FormData(this); |
| var request = new XMLHttpRequest(); |
| request.open('POST', '/upload'); |
| request.upload.addEventListener('progress', function(event) { |
| if (event.lengthComputable) { |
| var percentComplete = (event.loaded / event.total) * 100; |
| document.getElementById('progressBar').style.width = percentComplete + '%'; |
| document.getElementById('progressBar').innerText = Math.round(percentComplete) + '%'; |
| } |
| }, false); |
| request.addEventListener('load', function(event) { |
| var response = event.target.responseText; |
| var fullUrl = response.split('saved to ')[1]; |
| var filename = fullUrl.split('/').pop(); |
| document.getElementById('imageUrl').innerText = fullUrl; |
| displayMedia(fullUrl); |
| document.getElementById('progressBar').style.width = '0%'; |
| document.getElementById('progressBar').innerText = '0%'; |
| |
| localStorage.setItem('filename', filename); |
| localStorage.setItem('fileUrl', fullUrl); |
| }, false); |
| request.send(formData); |
| }); |
| function displayMedia(url) { |
| var mediaContainer = document.getElementById('mediaContainer'); |
| mediaContainer.innerHTML = ''; |
| var extension = url.split('.').pop().toLowerCase(); |
| if (['jpg', 'jpeg', 'png', 'gif'].includes(extension)) { |
| var img = document.createElement('img'); |
| img.src = url; |
| mediaContainer.appendChild(img); |
| } else if (['mp4', 'webm', 'ogg'].includes(extension)) { |
| var video = document.createElement('video'); |
| video.src = url; |
| video.controls = true; |
| mediaContainer.appendChild(video); |
| } else if (['mp3', 'wav', 'ogg'].includes(extension)) { |
| var audio = document.createElement('audio'); |
| audio.src = url; |
| audio.controls = true; |
| mediaContainer.appendChild(audio); |
| } else { |
| mediaContainer.innerText = 'Unsupported file type'; |
| } |
| } |
| function copyToClipboard(element) { |
| var tempInput = document.createElement("input"); |
| tempInput.value = element.innerText; |
| document.body.appendChild(tempInput); |
| tempInput.select(); |
| document.execCommand("copy"); |
| document.body.removeChild(tempInput); |
| Toastify({ |
| text: "URL copied to clipboard", |
| duration: 3000, |
| gravity: "top", |
| position: "center", |
| backgroundColor: "#4CAF50", |
| }).showToast(); |
| } |
| </script> |
| </body> |
| </html> |