如何导航到外部 URL 参数?

How can I navigate to an external URL parameter?

所以,我一直在尝试重定向 URL 并在新选项卡中打开它,但我无法做到。

我有一个 API,它返回一个以 BLOB 对象形式出现的纯文本,但实际上,它只是一个 URL。我需要在新标签页中打开 URL。

这是我要开始工作的代码:

    this.printingService.getCvUrl(options).subscribe(
      url => {
        const downloadURL = window.URL.createObjectURL(url);
        window.open(downloadURL, '_blank');
      }
    );

它调用了getCvUrl方法,它是这样的:

   getCvUrl(options: { remoteUrl: string, paperHeight?: string, paperWidth?: string }): Observable<any> {
    const user = this.authenticationService.getCurrentUser();
    const PRINT_SERVICE = `/api/users/${user.id}/syncMyCV`;
    const CV_SERVICE = 'https://cv.url/template/ce';

    const formData = new FormData();
    formData.append('remoteURL', CV_SERVICE + options.remoteUrl);
    formData.append('paperHeight', options.paperHeight);
    formData.append('paperWidth', options.paperWidth);

    const token = this.authenticationService.getToken();

    return this.http.post(
      PRINT_SERVICE,
      formData,
      {
        headers: {
          'Anonymous': 'undefined',
          'accept': '*/*',
          'Authorization': token
        },
        responseType: 'blob'
      }
    ).pipe(catchError(err => {
      this.errorService.handleError(err);
      return observableOf(null);
    }));
  }

作为回应,这当前正在为我打开一个新选项卡,内容为 URL 的文本,但不在浏览器的 URL 字段中。

我已经尝试了所有这些方法:

首先我尝试用路由器导航,当然,它没有用,因为我试图打开一个外部 URL.

    this.printingService.getCvUrl(options).subscribe(
      url => this.router.navigate([url])
    );

然后,看了一些题,尝试修改window位置的href属性。也没用

    this.printingService.getCvUrl(options).subscribe(
      url => window.location.href = url
    );

然后,根据另一个答案,我改用window打开方法,它打开了一个新标签,但是给我一个404错误

    this.printingService.getCvUrl(options).subscribe(
      url => window.open(url, '_blank')
    );

查看之后,我意识到我正在尝试将 blob 对象重定向为 URL 字符串,因此需要进行一些转换。然后我尝试使用我在我正在使用的同一服务中创建的方法。

    this.printingService.getCvUrl(options).subscribe(
      url => {
        this.printingService.view(url);
      }
    );

然后调用打印服务中的view()方法,实现如下:

    view(data: ArrayBuffer, filename = 'resume.pdf') {
    if (!!data) {
      const blob = new Blob([data], {type: 'application/pdf'});
      const downloadURL = window.URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = downloadURL;
      link.download = filename;
      link.click();
    }
  }

但问题是这种方法下载了一个pdf,但它甚至不是我想要的,所以我决定从那个方法中获取我需要的东西,并进行改编。然后我得到了上面的当前解决方案,它也不起作用:

    this.printingService.getCvUrl(options).subscribe(
      url => {
        const downloadURL = window.URL.createObjectURL(url);
        window.open(downloadURL, '_blank');
      }
    );

到目前为止,我 运行 没有想法。有没有人有任何其他我没有尝试过的方法?


使用已接受答案的解决方案:

在 getCvUrl 方法中,我更改了这一行:

responseType: 'blob'

通过这个:

responseType: 'text'

因为来自 API 的答案将始终是 text/plain 响应。最终代码如下所示:

    this.printingService.getCvUrl(options).subscribe(
      url => {
        const downloadLink = document.createElement('a');
        downloadLink.href = url;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
      }
    );

试试这个包 file-saver

很容易实现。

import { saveAs } from 'file-saver';

 this.http
  .post(
    yourURL
    {
      responseType: 'arraybuffer',
    }
  )
  .subscribe((val: any) => {
    const blob = new Blob([val], { type: 'application/pdf' });
    const url = window.URL.createObjectURL(blob);
    saveAs(blob, 'name.pdf');
  });

我不确定这是否可行,但请尝试将 link 元素添加到 DOM,然后再单击它,然后将其删除。

function openBlob(data: Blob) {
  //Add a link and click it!
  const downloadLink = document.createElement("a");
  downloadLink.href = window.URL.createObjectURL(data);
  downloadLink.download = filename;
  document.body.appendChild(downloadLink);
  downloadLink.click();
  document.body.removeChild(downloadLink);
}