.html
<input type='file' onchange="readURL(this);" />
<img id="blah" src="http://placehold.it/180" alt="your image" />
.css
img{
max-width:180px;
}
input[type=file]{
padding:10px;
background:#2d2d2d;}
.js
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
document.getElementById('blah').src=e.target.result
};
reader.readAsDataURL(input.files[0]);
}
}
アップロードする前に画像のプレビューを表示するこのコードがあります。しかし、私はangular 5で作業しているので、.jsの代わりに.tsファイルを使用します。angular 5。すべてのブラウザで画像を表示してください。
.html
入力のイベントattrおよびハンドラーパラメーターを更新します。また、src属性にデータバインディングを使用する必要があります。 nullまたは未定義またはハードコードされたURL( ' http://placehold.it/18 ')でない場合、以下がsrcを適用します
<input type='file' (change)="readURL($event);" />
<img id="blah" [src]="imageSrc || 'http://placehold.it/180'" alt="your image" />
.ts
コンポーネントtsファイル(クラス)には、ビュー(html)で使用されるプロパティimageSrc
があり、関数はそのクラスのメソッドである必要があります
...
imageSrc: string;
...
constructor(...) {...}
...
readURL(event: Event): void {
if (event.target.files && event.target.files[0]) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = e => this.imageSrc = reader.result;
reader.readAsDataURL(file);
}
}
以下のコードを使用して画像プレビューを実装しています。
onFileChange(event: any) {
this.userFile = event.target.files[0];
this.imageSelected = this.userFile.name;
if (event.target.files && event.target.files[0]) {
const reader = new FileReader();
reader.onload = (e: any) => {
this.imageSrc = e.target.result;
};
reader.readAsDataURL(event.target.files[0]);
}}
これはうまく機能し、画像のプレビューを表示します。私が最初に直面した問題は、画像プレビューが生成されるたびにchrome開発者ツールで以下のエラーを受け取ったことです。
すべてが正常に機能しましたが、他のエラーはありません。
Null:1をクリックすると、以下にリダイレクトされました。
いくつかのいじりとトラブルシューティングの後、私は以下の編集に含めた解決策を見つけることができました。
編集:それを考え出した。私は||を持っていませんでした「 http://placehold.it/18 '」は、component.htmlの[src] = "に含まれています。そのタイミングの問題を推測します。並べ替え済み。これ以上のエラーはありません。
次のようにjavascript function
をTypeScript
に変更する必要がある場合があります。
readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = (e:any) => {
(<HTMLImageElement>document.getElementById('blah')).src=e.target.result
//assuming element with id blah will always be an ImageElement
};
reader.readAsDataURL(input.files[0]);
}
}
それであるはずです。
更新
また、プロパティを定義し、それを画像srcにバインドし、それに応じて以下のように値を変更できます。
constructor
の前の.ts
ファイルで、プロパティをurl
として定義し、そのデフォルト値をhttp://placehold.it/180
に設定します。
url: string = 'http://placehold.it/180';
以下のように、reader.onload
内でこのプロパティを更新できます。
readURL(event:any) {
if (event.target.files && event.target.files[0]) {
var reader = new FileReader();
reader.onload = (event:any) => {
this.url = event.target.result;
}
reader.readAsDataURL(event.target.files[0]);
}
}
html
は次のようになります。
<input type='file' (change)="readURL(this);" />
<img id="blah" [src]="url" alt="your image" />
-> this.url = event.target.result;
readURL(event:any) {
if (event.target.files && event.target.files[0]) {
var reader = new FileReader();
reader.onload = (event:any) = > {
this.url = event.target.result;
}
reader.readAsDataURL(event.target.files[0]);
}
}
私は遅れていることは知っていますが、画像と音声の両方でこの問題に遭遇しました。上記のソリューションは、画像ではうまく機能しましたが、音声ではあまりうまくいきませんでした。最終的には、誰もが使用しているFileReaderオブジェクトの代わりにURLオブジェクトを使用することで、すべてが機能するようになりました。次のようなもの
component.tsファイル〜
imgSrc = 'assets/path/to/default/image.jpeg'
imgFileSelected(event: any) {
if (event.target.files && event.target.files[0]) {
this.imgSrc = URL.createObjectURL(event.target.files[0]);
}
}
私のcomponent.htmlは次のようになります〜
<img [src]="imgSrc | sanitizeUrl"> <!-- using a Custom Pipe -->
最後に、コンソールから警告を取り除くカスタムパイプを作成しました。私のパイプは次のとおりです〜
@Pipe({
name: 'sanitizerUrl'
})
export class SanitizerUrlPipe implements PipeTransform {
constructor (
private sanitize: DomSanitizer
) {}
transform(value: string): SafeUrl {
return this.sanitize.bypassSecurityTrustUrl(value);
}
}
オーディオタグにこれをどのように使用したかを確認するには、 このリンクをチェックアウトしてください。 わかりやすいコードが2行だけ追加されています。