Задать вопрос
yaNastia
@yaNastia

Как избежать добавления тех самых элементов при каждом следующем клике?

Есть реализованая логика скачивания архива с файлами внутри, но при каждом клике на скачивание, файлы в архиве добавляються и добавляються (см прик. фото), как избежать такое поведение и сделать что бы при каждом клике скачивались файлы без копий?5ef388b658deb763529430.png

class ExporterBase {
    constructor(data) {
        this._data = data
        this.mimeType = "text/plain"
        this.fileType = "txt"
        this.defaultFileName = "export"
        this.defaultZIPName = "dashboardDataToExport"
        this.filesToZIP = []
    }

    get data() {
        return this._data
    }

    set data(data) {
        this._data = data
    }

    generate(fileName) {
        const name = this.getFileName(fileName)
        const content = this.getContent()
        return downloadFile(content, name, this.mimeType)
    }
// здесь добавляю файлы в массив чтобы потом поместить в архив, думаю проблема здесь
    generateFilesToZIP(fileName) {
        const name = this.getFileName(fileName)
        const content = this.getContent()
        this.filesToZIP.push({ content, fileName: name, mimeType: this.mimeType })
    }

    getFileName(name) {
        const fileName = name || this.defaultFileName
        return `${fileName}.${this.fileType}`
    }
// отправляю имя архива и масив с файлами
    getZIPName(name) {
        const fileType = "zip"
        const formattedFileName = name.split(" ").join("") || this.defaultZIPName
        const zipName = `${formattedFileName}.${fileType}`
        return generateZip(zipName, this.filesToZIP)
    }

    getContent() {
        return this.data.toString()
    }
}
// создаю архив с файлами
function generateZip(name, filesContent) {
    console.log(filesContent, name)
    const zip = new JSZip()
    const mimeType = "application/zip"
    filesContent.forEach((tile) => {
        zip.file(tile.fileName, tile.content)
    })
    zip.generateAsync({ type: "blob" }).then((content) => {
        downloadFile(content, name, mimeType)
    })
}
// скачиваю архив с файлами
function downloadFile(content, fileName, type) {
    const file = new File([content], fileName, { type })
    const element = window.document.createElement("a")
    element.href = window.URL.createObjectURL(file)
    element.download = fileName
    element.click()
}
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
xEpozZ
@xEpozZ
Веб-разработчик
getZIPName(name) {
    const fileType = "zip"
    const formattedFileName = name.split(" ").join("") || this.defaultZIPName
    const zipName = `${formattedFileName}.${fileType}`
    const files = this.filesToZIP
    this.filesToZIP = []
    return generateZip(zipName, files)
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы