WedX - журнал о программировании и компьютерных науках

Angular 2 Лучший подход к использованию FileSaver.js

Мне нужно использовать FileSaver.js (https://github.com/eligrey/FileSaver.js/) в моем приложении Angular2.

Я знаю, что могу добавить его как файл сценария на главную страницу html, и он будет работать. Но мне было интересно, что было бы лучшим подходом в случае приложения Angular 2 (TypeScript), чтобы я мог просто вызвать window.saveAs для сохранения файла.


  • Какой инструмент сборки вы используете? 25.10.2016

Ответы:


1

Мне удалось заставить его работать, используя этот подход (Angular-CLI):

npm install file-saver --save
npm install @types/file-saver --save

После этого импортируйте Filesaver в компонент:

import * as FileSaver from 'file-saver';

И вы можете использовать его следующим образом:

    let blob = new Blob([document.getElementById('exportDiv').innerHTML], {
            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-16le"
        });
    FileSaver.saveAs(blob, "export.xls");    

Как видите, вам не нужно ничего добавлять в angular-cli.json. Просто установите библиотеку и ее типы, импортируйте ее, и вы готовы к работе.

25.01.2017
  • Ни одно из других предложений не сработало для меня, но это сделало работу хорошо. 25.01.2017
  • Это спасло жизнь. Спасибо 13.06.2017
  • Есть ли способ вызвать приглашение, а не автоматическую загрузку? 06.07.2017
  • Это отлично сработало для меня, но мне даже не нужно было устанавливать второй пакет @types/file-saver. Также: @JasonBourne, у вас ошибка в файле: P 24.07.2017
  • Получение этой ошибки: Аргумент типа '{ imports: (typeof CommonModule | typeof FileSaver) []; объявления: (typeof DashboardComponent |...' не может быть присвоен параметру типа 'NgModule'. Типы свойства 'imports' несовместимы. Тип '(typeof CommonModule | typeof FileSaver)[]' не может быть присвоен типу '(любой [] | Type‹any› | ModuleWithProviders)[]». Тип «typeof CommonModule | typeof FileSaver» не может быть назначен типу «any[] | Type‹any› | ModuleWithProviders». 18.01.2018
  • praveen, чтобы помочь вам, вы можете поделиться с нами кодом вашего компонента? 18.01.2018
  • Я получаю FileSaver.saveAs is not a function. Похоже, что FileSaver, который я импортировал, на самом деле является функцией saveAs. Как будто есть несоответствие между @type и реализацией 25.01.2018
  • вы можете сохранить внутри devDependencies: npm install @types/file-saver --save-dev 29.05.2018
  • Решение сработало для меня, но оно загружает файл в хроме вместо того, чтобы сохранять его в указанном месте файла, это ожидается или я делаю что-то неправильно? 07.05.2020
  • @RDV, да, это задумано. 08.05.2020
  • Если я просто хочу отобразить и открыть файл, используя URL-адрес BLOB-объекта на новой вкладке, и позволить пользователю решать, сохранять его или нет, в этом случае эта библиотека будет мне полезна? 19.02.2021

  • 2

    Если вы используете Angular-CLI для сборки своего проекта, вы можете установить его, запустив

    npm install file-saver --save
    

    Поскольку для FileSaver нет типизации, мне пришлось сделать:

    declare module "file-saver";
    

    в моем файле typings.d.ts.

    Затем, чтобы использовать его:

    // Import
    import * as FileSaver from "file-saver";
    
    //Implementation
    FileSaver.saveAs(blob, filename);
    

    Для справки, эти шаги взяты из шагов Angular-Cli по установке сторонних библиотеки

    Изменить от 27 сентября 2017 г.: похоже, теперь есть определение типа для FileSaver.js согласно инструкции README, поэтому вместо

    declare module "file-saver"
    

    тебе просто нужно

    npm install @types/file-saver --save-dev
    
    26.10.2016
  • У меня та же проблема, что описана выше, но я не использую angular-cli. Я установил модуль сохранения файлов, добавил его в свой system.config.js. Однако при загрузке некоторых файловых зависимостей он выдал 404, потому что не смог найти расширение .js для их загрузки. Пожалуйста помоги 24.11.2016
  • @ Elliott08 Так и должно быть! По крайней мере, я использовал его в проекте Angular 5. 22.03.2018

  • 3

    Простое выполнение npm install file-saver --save — хорошее начало. Вам также нужен файл объявления машинописного текста (например, file-saver.d.ts или typings.d.ts), поскольку эта библиотека находится в простом javascript. Обычно вы получаете его, выполнив npm install @types/file-saver, но этот пакет в настоящее время устарел.

    Я создал для себя файл file-saver.d.ts — просто поместите его в исходный каталог.

    file-saver.d.ts

    declare function saveAs(data: Blob, filename: string, noAutoBOM?: boolean): void;
    declare module 'file-saver' {
        export = saveAs;
    }
    

    Затем вы можете использовать saveAs следующим образом:

    ваш.ts

    import saveAs = require('file-saver');
    function save() {
        let blob = new Blob(['Hello world!'], { type: 'text/plain;charset=utf-8' });
        saveAs(blob, 'newcontrol.txt');
    }
    

    Конечно, не забудьте обновить конфигурацию вашего загрузчика.

    Для SystemJS вам нужно что-то вроде этого:

    /**
     * System configuration for Angular samples
     * Adjust as necessary for your application needs.
     */
    (function (global) {
      System.config({
        paths: {
          // paths serve as alias
          'npm:': 'node_modules/'
        },
        // map tells the System loader where to look for things
        map: {
          // our app is within the app folder
          app: 'app',
    
          // angular bundles
          '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
          '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
          '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
          '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
          '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
          '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
          '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
          '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
    
          // other libraries
          'rxjs':                      'npm:rxjs',
          'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js',
          'file-saver':                'npm:file-saver'
        },
        // packages tells the System loader how to load when no filename and/or no extension
        packages: {
          app: {
            main: './main.js',
            defaultExtension: 'js'
          },
          rxjs: {
            defaultExtension: 'js'
          },
          'file-saver': {
            main: './FileSaver.js',
            defaultExtension: 'js'
          }
        }
      });
    })(this);
    
    21.12.2016
  • Благодарим вас за предоставление файла filesaver.d.ts. Это все, что мне было нужно. 04.03.2017

  • 4

    Даже не самый лучший способ, как упоминали другие люди, я предпочитаю использовать существующий пакет из NPM, который называется ngx-filesaver. Он даже отлично работает с Angular Universal.

    Просто делать:

    npm install file-saver ngx-filesaver --save


    Включите в свой модульный проект:

    ...
    import { FileSaverModule } from 'ngx-filesaver';
    ...
    @NgModule({
      imports: [ FileSaverModule ]
    })
    ...
    


    Затем загрузите службу в свой компонент:

    ....
    import {FileSaverService} from 'ngx-filesaver';
    ...
    
    @Component({
        ...
    })
    ...
    constructor(Http, private fileSaverService: FileSaverService) {
    }
    
    onSave() {
     workbook.xlsx.writeBuffer()
          .then( (buffer) => {
    
            //I am saving spreadsheed ( XLSX ) buffer here...
            this.fileSaverService.save(new Blob([buffer], { type: 'application/octet-stream'}), `${fileName}.xlsx`);
    
          });
    }
    

    Более подробную информацию можно найти на странице https://www.npmjs.com/package/ngx-filesaver

    10.05.2019
  • ngx-filesaver зависит от filesaver.js, который по-прежнему не решает проблему. 19.03.2021
  • Не уверен, что имеется в виду под не решает проблему, в другом ответе в этой теме он даже работает, имея собственное определение машинописного текста: stackoverflow.com/a/41265382/3168185 . 19.03.2021
  • Я получил ту же ошибку при установке FileSaverService. Простая установка @types/file-saver также не решила проблему для меня, вероятно, потому, что я использую angular в строгом режиме. Что действительно сработало, так это установка файловых заставок, ссылка на файловые заставки в моем коде, а затем перенаправление файловых заставок на @types/file-saver в моем tsconfig.json. Отстой, но это единственная конфигурация, которая сработала для меня. 23.03.2021
  • Никогда раньше не было такого опыта. Спасибо, что поделился. Надеюсь, это поможет другим. 23.03.2021
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]