Angular 6清理本地驱动器URL

时间:2018-11-09 08:43:35

标签: angular angular-dom-sanitizer

我尝试使用DomSanitizer方法来净化以下类型的url,但没有成功

C:\path\to\executable

有什么办法可以清理此网址以用作href值?

我还要用[]表示法绑定值,所以我确定它不会作为字符串插值。

2 个答案:

答案 0 :(得分:5)

首先,该网址应为C:/path/to/executable而不是一个C:\path\to\executable

根据http://www.ietf.org/rfc/rfc2396.txt,反斜杠字符不是网址中的有效字符

大多数浏览器都将反斜杠转换为正斜杠。从技术上讲,如果您在URL中需要反斜杠字符,则需要使用%5C对其进行编码。

现在要进行消毒

您可以只绑定一个使用DomSanitizer中的bypassSecurityTrustUrl()返回安全网址的函数

app.component.html

<a [href]="getlink()"> link  </a>

app.component.ts

import { DomSanitizer} from '@angular/platform-browser';


export class AppComponent  {
  constructor(private sanitizer:DomSanitizer) {    }
  name = 'Angular';

  getlink():SafeUrl {
      return this.sanitizer.bypassSecurityTrustUrl("C:/path/to/executable");
  }
}

推荐

使用管道:     您可以创建管道来禁用Angular的内置清理功能

safe.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {

  constructor(protected sanitizer: DomSanitizer) {}

 public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
    switch (type) {
            case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
            case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
            case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
            case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
            case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
            default: throw new Error(`Invalid safe type specified: ${type}`);
        }
  }
}

注意:不要忘记将此管道服务注入您的app.module.ts

import { SafePipe } from './shared/safe-url.pipe';


@NgModule({ declarations: [SafePipe],...});

现在您可以使用管道禁用内置清理

 <a [href]="'C:/path/to/executable' | safe: 'url'"> link </a>

由于代码可重用,因此我建议使用管道,这也是工作示例:https://stackblitz.com/edit/angular-vxcvfr

答案 1 :(得分:0)

我这样使用它:
在ts文件中。

import { DomSanitizer } from '@angular/platform-browser';
constructor(
        public domSanitizer: DomSanitizer
    ) { }

在HTML文件中

<img [src]="domSanitizer.bypassSecurityTrustUrl(pazar.imagedata)" class="zoom">