112 lines
3.0 KiB
JavaScript
112 lines
3.0 KiB
JavaScript
/**
|
||
* File Utilities
|
||
*
|
||
* Функции для работы с файлами (загрузка, сохранение).
|
||
*/
|
||
|
||
/**
|
||
* Скачать данные как JSON файл
|
||
* @param {object} data - Данные для экспорта
|
||
* @param {string} filename - Имя файла
|
||
*/
|
||
export function downloadJSON(data, filename) {
|
||
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' })
|
||
const url = URL.createObjectURL(blob)
|
||
const a = document.createElement('a')
|
||
a.href = url
|
||
a.download = filename
|
||
document.body.appendChild(a)
|
||
a.click()
|
||
document.body.removeChild(a)
|
||
URL.revokeObjectURL(url)
|
||
}
|
||
|
||
/**
|
||
* Загрузить файл как JSON
|
||
* @param {File} file - Файл для загрузки
|
||
* @returns {Promise<object>} Распарсенный JSON объект
|
||
*/
|
||
export async function loadFileAsJSON(file) {
|
||
return new Promise((resolve, reject) => {
|
||
const reader = new FileReader()
|
||
|
||
reader.onload = (e) => {
|
||
try {
|
||
const data = JSON.parse(e.target.result)
|
||
resolve(data)
|
||
} catch (error) {
|
||
reject(new Error('Невалидный JSON формат'))
|
||
}
|
||
}
|
||
|
||
reader.onerror = () => {
|
||
reject(new Error('Ошибка чтения файла'))
|
||
}
|
||
|
||
reader.readAsText(file)
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Загрузить файл как текст
|
||
* @param {File} file - Файл для загрузки
|
||
* @returns {Promise<string>} Содержимое файла
|
||
*/
|
||
export async function loadFileAsText(file) {
|
||
return new Promise((resolve, reject) => {
|
||
const reader = new FileReader()
|
||
|
||
reader.onload = (e) => {
|
||
resolve(e.target.result)
|
||
}
|
||
|
||
reader.onerror = () => {
|
||
reject(new Error('Ошибка чтения файла'))
|
||
}
|
||
|
||
reader.readAsText(file)
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Создать input для выбора файла и вернуть выбранный файл
|
||
* @param {string} accept - MIME типы (например, 'application/json')
|
||
* @returns {Promise<File|null>} Выбранный файл или null
|
||
*/
|
||
export async function selectFile(accept = '*') {
|
||
return new Promise((resolve) => {
|
||
const input = document.createElement('input')
|
||
input.type = 'file'
|
||
input.accept = accept
|
||
|
||
input.onchange = (e) => {
|
||
const file = e.target.files[0]
|
||
resolve(file || null)
|
||
}
|
||
|
||
input.oncancel = () => {
|
||
resolve(null)
|
||
}
|
||
|
||
input.click()
|
||
})
|
||
}
|
||
|
||
/**
|
||
* Скачать текст как файл
|
||
* @param {string} text - Текст для сохранения
|
||
* @param {string} filename - Имя файла
|
||
* @param {string} mimeType - MIME тип (по умолчанию text/plain)
|
||
*/
|
||
export function downloadText(text, filename, mimeType = 'text/plain') {
|
||
const blob = new Blob([text], { type: mimeType })
|
||
const url = URL.createObjectURL(blob)
|
||
const a = document.createElement('a')
|
||
a.href = url
|
||
a.download = filename
|
||
document.body.appendChild(a)
|
||
a.click()
|
||
document.body.removeChild(a)
|
||
URL.revokeObjectURL(url)
|
||
}
|