Скачать файл не работает

Я новичок в Javascript, я хочу загрузить файл, который исходит из динамического url после результата обещания, это сгенерированный PDF файл, который я пытаюсь загрузить с помощью следующего вызова, но не могу заставить его работать как загрузка. t начать.

<button (click)='downloadMyFile()'>Download</button>

downloadMyFile(){
  //url 
  .then((result)=>{
   //result is contains a url www.abc.com/file234
    window.location.href = result
})
  .catch((error)=>{
   //myerror
})
}

Вот плунж

Ответы

Ответ 1

Вы можете принудительно загрузить файл загрузки следующим образом:

const link = document.createElement('a');
link.href = result;
link.download = 'download';
link.target = '_blank';
link.click();

Просто создайте привязывающий тег, установите его атрибуты href и download и активируйте событие click.

Также обратите внимание, что на самом деле это не касается URL-адреса, заканчивающегося расширением или нет, - это больше о заголовках, которые вы отправляете с ответом на файл (а именно Content-Type и Content-Disposition).

Ответ 2

<button (click)='downloadMyFile()'>Download</button>

downloadMyFile(){
  .then((result)=>{
       var a= document.createElement('a');
       a.href = result;
       a.download = 'download name';
       a.click();
   }).catch((error)=>{})
}

Ответ 3

Используйте эту строку кодов:

    //redirect current page to success page
    window.location="www.example.com/success.html";
    window.focus();

ИЛИ Вы можете использовать pdf.js из http://mozilla.github.io/pdf.js/

    PDFJS.getDocument({ url: pdf_url }).then(function(pdf_doc) {
        __PDF_DOC = pdf_doc;
        __TOTAL_PAGES = __PDF_DOC.numPages;

        // Hide the pdf loader and show pdf container in HTML
        $("#pdf-loader").hide();
        $("#pdf-contents").show();
        $("#pdf-total-pages").text(__TOTAL_PAGES);

        // Show the first page
        showPage(1);
    }).catch(function(error) {

        alert(error.message);
    });;

Источник и полный код: http://usefulangle.com/post/20/pdfjs-tutorial-1-preview-pdf-during-upload-wih-next-prev-buttons

Ответ 4

вместо того, чтобы делать запрос ajax для загрузки файла, просто выполните следующее.

window.open(url);

Ответ 5

(3 разных файла) в app.module.ts:

 import {HttpClientModule} from '@angular/common/http';
 ...
 providers: [
    HttpClientModule,
    ...

в api.service.ts:

import {HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse} from '@angular/common/http';
...
public getMeMyPDF(): any {
    const url =  '/my/api/for/pdf';
    this.PDF = this.http.get(url, {
      observe: 'response',
      headers: new HttpHeaders({'Content-Type', 'application/pdf'}),
      responseType: 'text' as 'text' // <-- this part is rediculous but necessary
    }).catch(this.handleError);
    return this.PDF;
}

handleError(error: HttpErrorResponse) {
  console.log('an http get error happened.');
  console.error(error);
  let errorMessage;
  if (error.error instanceof Error) {
    errorMessage = 'An error occurred: ${error.error.message}';
  } else {
    errorMessage = 'Server returned code: ${error.status}, error message is: ${error.message}';
  }
  console.error(errorMessage);
  return errorMessage;
}

и в my.component.that.calls.api:

getMeAPDF(){
    this.apiService.getMeMyPDF().subscribe(res => {
      if(res !== null && res !== undefined){
        this.saveToFileSystem(res.body);
      }
    }, (error) => console.log(error), () => {});
  }

  private saveToFileSystem(response) {
    const blob = new Blob([response], { type: 'text/pdf' });
    const d = new Date();
    saveAs(blob, 'WOWPDF_' + this._datepipe.transform(d, 'yyyyMMdd_HHmmss') + '.pdf');
  }

Ответ 6

использовать функцию saveAs() с помощью npm install @types/file-saver --save-dev

или в package.json:

  "dependencies": {
    "file-saver": "^1.3.3"
  }

Образец для экспорта CSV файла:

HTML:

<button (click)="exportCsv()" id="exportCsv" class="btn btn-primary" type="submit">CSV Export</button>

Составная часть:

import { FooService } from '../services/foo.service';

constructor(private fooService: FooService) { }

async exportCsv() {
  this.fooService.exportCsv(this.fooid);
}

Сервис (fooService):

import { saveAs } from 'file-saver';
import { HttpParams, HttpResponse} from '@angular/common/http';

exportCsv(fooid: string) {
    let params: HttpParams = new HttpParams();
    params = params.append('fooid', fooid);
    this.apiService.getCSVFile('api/foo/export', params).subscribe(response => this.saveToFileSystem(response)
    , error =>  this.errorProcessor(error));
}

private saveToFileSystem(response: HttpResponse<Blob>) {
    const contentDispositionHeader = response.headers.get('Content-Disposition');
    let filename = 'export.csv';
    if (contentDispositionHeader !== null) {
      const parts: string[] = contentDispositionHeader.split(';');
      filename = parts[1].split('=')[1];
    }
    const blob = response.body;
    if (blob !== null) {
        saveAs(blob, filename);
    }
  }

Ответ 7

Вы можете загрузить ответ своего обещания, как указано ниже:

 var triggerDownload = function(url, fileName) {
      var a = document.createElement("a");
      a.setAttribute("href", url);
      a.setAttribute("download", fileName);
      opts.container.append(a);
      a.click();
      $(a).remove();
  };

  downloadMyFile() {
      promise
       .then((result) => {
          triggerDownload(result, 'xyz.pdf'); 
        })
       .catch((error) => {
          //myerror
      })
  }

Ответ 8

Вот код, который работает для загрузки API в IE и chrome/safari. Здесь переменная ответа - ответ API.

 let blob = new Blob([response], {type: 'application/pdf'});
    let fileUrl = window.URL.createObjectURL(blob);
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, fileUrl.split(':')[1] + '.pdf');
    } else {
        window.open(fileUrl);
    }

Ответ 9

вы можете загрузить любой динамический файл, просто напишите загрузку в теге, где вы выбрали url для файла. попробуйте это и сообщите мне, если он сработает для вас.

вот рабочий пример:

<a href="http://unec.edu.az/application/uploads/2014/12/pdf-sample.pdf" download>

Ответ 10

Javascript на самом деле не нужен для этого, поэтому я предлагаю самое ленивое и самое простое решение - вместо этого просто используйте базовый тег html.

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

<a href="www.abc.com/file234" download="SuggestedFileName">Download</a>

Очень старые браузеры, которые не поддерживают HTML5, потерпят неудачу элегантно - вместо загрузки целевой страницы старые браузеры просто отображают цель в браузере. Это очень грациозная деградация и вполне приемлемый откат.

Вы можете привязать якорь так, как хотите, с помощью css, а также наиболее семантически правильный тег: привязки для ссылок (и это ссылка), а кнопки для взаимодействия с формами (например, submit) или другими взаимодействиями с UI. Конечный пользователь не будет знать, какой тег вы используете в любом случае.

Если URL будет изменен, например, получение разных параметров на основе взаимодействия с пользовательским интерфейсом, вы всегда можете использовать javascript для обновления URL-адреса в теге, но это другой вопрос.

Ссылка для тега привязки на MDN