これが私のテンプレートです:
<label>{{label}}</label>
<input type="file" (change)="fileUpload($event)" id="file-input" style="position:absolute; top: -999999px" #fileInp>
<button ion-button (click)="onClick()">Upload</button>
およびtsファイル:
@ViewChild('fileInp') fileInput: ElementRef;
@Input() label: string;
@Output() data = new EventEmitter<FormData>();
fileUpload(event) {
let fd = new FormData();
fd.append('file', event.srcElement.files[0]);
this.data.emit(fd);
}
onClick() {
this.fileInput.nativeElement.click();
}
Androidとブラウザではすべて正常に機能しますが、iOSでは機能しません。テンプレートのボタンを無効にしても同じコードが機能します。
IOSではファイル入力のクリックをトリガーすることはできません。回避策は、cssを使用して入力要素の不透明度を0に設定し、ボタンのすぐ上に配置することです。そうすれば、ファイル入力は表示されませんが、ボタンをクリックするとクリックされます。
<ion-item>
<label>{{label}}</label>
<input type="file" (change)="fileUpload($event)" id="file-input" style="opacity: 0" #fileInp>
<button ion-button (click)="onClick()">Upload</button>
</ion-item>
次に、.scssファイルで:
#file-input {
opacity: 0;
position: absolute;
top: 0;
width: 100%;
height: 100%;
left: 0;
z-index: 999;
}
この問題を解決する方法は他にもいくつかあると思いますが、それが私が過去に取り組んだアプリで管理した方法です。
私が見つけた最善の方法は、for
属性を持つラベルを使用し、cssを使用してカスタマイズすることです。したがって、ユーザーがラベルをクリックすると、入力がトリガーされます。 for
ラベルは入力IDでなければならないことに注意してください。
<label class="myFakeUploadButton" for="myFileInput">Upload</label>
<input type="file" id="myFileInput">
#myFileInput{
position: absolute;
opacity: 0;
}
.myFakeUploadButton{
/* Whatever you want */
}
私は通常次のことをします。
<ion-item>
<ion-button color="primary" (click)="inputFile.click()">
<ion-icon name="attach"></ion-icon> Anexar documentos
</ion-button>
<input #inputFile id="input-file" style="opacity:0" type="file" (change)="uploadFiles($event)"
multiple/>
</ion-item>