brief-rags-bench/static/js/utils/file.utils.js

112 lines
3.0 KiB
JavaScript
Raw Normal View History

2025-12-25 09:07:57 +01:00
/**
* 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)
}