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

112 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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)
}