168 lines
5.3 KiB
HTML
168 lines
5.3 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta charset="UTF-8">
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
<title>File Storage Interface</title>
|
||
|
<style>
|
||
|
body {
|
||
|
font-family: Arial, sans-serif;
|
||
|
max-width: 800px;
|
||
|
margin: 0 auto;
|
||
|
padding: 20px;
|
||
|
}
|
||
|
h1 {
|
||
|
text-align: center;
|
||
|
}
|
||
|
#file-list {
|
||
|
list-style-type: none;
|
||
|
padding: 0;
|
||
|
}
|
||
|
#file-list li {
|
||
|
margin-bottom: 10px;
|
||
|
padding: 10px;
|
||
|
background-color: #f0f0f0;
|
||
|
border-radius: 5px;
|
||
|
}
|
||
|
#file-list button {
|
||
|
margin-left: 10px;
|
||
|
}
|
||
|
</style>
|
||
|
</head>
|
||
|
<body>
|
||
|
<h1>File Storage Interface</h1>
|
||
|
<input type="file" id="file-input">
|
||
|
<button onclick="uploadFile()">Upload</button>
|
||
|
<h2>File List</h2>
|
||
|
<ul id="file-list"></ul>
|
||
|
|
||
|
<script>
|
||
|
class FileStorage {
|
||
|
constructor() {
|
||
|
this.storage = localStorage;
|
||
|
}
|
||
|
|
||
|
upload(file) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const reader = new FileReader();
|
||
|
reader.onload = (event) => {
|
||
|
const fileData = event.target.result;
|
||
|
const fileInfo = {
|
||
|
name: file.name,
|
||
|
size: file.size,
|
||
|
type: file.type,
|
||
|
data: fileData
|
||
|
};
|
||
|
this.storage.setItem(file.name, JSON.stringify(fileInfo));
|
||
|
resolve(fileInfo);
|
||
|
};
|
||
|
reader.onerror = (error) => reject(error);
|
||
|
reader.readAsDataURL(file);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
download(fileName) {
|
||
|
const fileInfo = this.getFileInfo(fileName);
|
||
|
if (!fileInfo) {
|
||
|
throw new Error('File not found');
|
||
|
}
|
||
|
const link = document.createElement('a');
|
||
|
link.href = fileInfo.data;
|
||
|
link.download = fileInfo.name;
|
||
|
link.click();
|
||
|
}
|
||
|
|
||
|
delete(fileName) {
|
||
|
this.storage.removeItem(fileName);
|
||
|
}
|
||
|
|
||
|
list() {
|
||
|
return Object.keys(this.storage)
|
||
|
.map(key => this.getFileInfo(key))
|
||
|
.filter(fileInfo => fileInfo !== null)
|
||
|
.map(fileInfo => ({
|
||
|
name: fileInfo.name,
|
||
|
size: fileInfo.size
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
stat(fileName) {
|
||
|
const fileInfo = this.getFileInfo(fileName);
|
||
|
if (!fileInfo) {
|
||
|
throw new Error('File not found');
|
||
|
}
|
||
|
return {
|
||
|
name: fileInfo.name,
|
||
|
size: fileInfo.size
|
||
|
};
|
||
|
}
|
||
|
|
||
|
getFileInfo(fileName) {
|
||
|
try {
|
||
|
const fileInfo = JSON.parse(this.storage.getItem(fileName));
|
||
|
if (fileInfo && fileInfo.name && fileInfo.size) {
|
||
|
return fileInfo;
|
||
|
}
|
||
|
} catch (error) {
|
||
|
console.warn(`Invalid file info for ${fileName}:`, error);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const fileStorage = new FileStorage();
|
||
|
|
||
|
function uploadFile() {
|
||
|
const fileInput = document.getElementById('file-input');
|
||
|
const file = fileInput.files[0];
|
||
|
if (file) {
|
||
|
fileStorage.upload(file).then(() => {
|
||
|
updateFileList();
|
||
|
fileInput.value = '';
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function downloadFile(fileName) {
|
||
|
fileStorage.download(fileName);
|
||
|
}
|
||
|
|
||
|
function deleteFile(fileName) {
|
||
|
fileStorage.delete(fileName);
|
||
|
updateFileList();
|
||
|
}
|
||
|
|
||
|
function updateFileList() {
|
||
|
const fileList = document.getElementById('file-list');
|
||
|
fileList.innerHTML = '';
|
||
|
const files = fileStorage.list();
|
||
|
files.forEach(file => {
|
||
|
const li = document.createElement('li');
|
||
|
li.textContent = `${file.name} (${formatSize(file.size)})`;
|
||
|
const downloadBtn = document.createElement('button');
|
||
|
downloadBtn.textContent = 'Download';
|
||
|
downloadBtn.onclick = () => downloadFile(file.name);
|
||
|
const deleteBtn = document.createElement('button');
|
||
|
deleteBtn.textContent = 'Delete';
|
||
|
deleteBtn.onclick = () => deleteFile(file.name);
|
||
|
li.appendChild(downloadBtn);
|
||
|
li.appendChild(deleteBtn);
|
||
|
fileList.appendChild(li);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function formatSize(bytes) {
|
||
|
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
||
|
let size = bytes;
|
||
|
let unitIndex = 0;
|
||
|
while (size >= 1024 && unitIndex < units.length - 1) {
|
||
|
size /= 1024;
|
||
|
unitIndex++;
|
||
|
}
|
||
|
return `${size.toFixed(2)} ${units[unitIndex]}`;
|
||
|
}
|
||
|
|
||
|
updateFileList();
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|