cod*_*bot 5 file-upload image-uploading angular angular-reactive-forms angular6
我尝试创建一个UI,其中有一个带有几个文本字段的表单,a input type="file"
和a div
可以删除要与表单其余部分一起上传的图像.
我的目标/逻辑
使用相同的方法div
来删除图像或单击它并打开文件夹资源管理器,如input type="file"
行为.在小屏幕中启用点击是有意义的,实际上不可能"拖放".并且由于input type="file"
表格中已经有一个没有理由从中获取图像div
并将其附加到表格等等.我尝试拍摄掉的图像div
,将其设置为值input type="file"
并提交形成一次.(如果用户点击了div
,那么input type="file"
已经有了一个值,所以我可以再次自由提交表单).
这是代码
<div id="imageDrop" (click)='imageInput.click()' (drop)="drop($event)" (dragover)="allowDrop($event)" #imageDrop>
</div>
<input type="file" formControlName="imageInput" required #imageInput id="imageInput" (change)='imageChange($event)' > <!-- use css to hide it -->
Run Code Online (Sandbox Code Playgroud)
所以,当imageDrop
点击时,实际上调用imageChange
via(click)='imageInput.click()'
这是组件中的打字稿.
//imageUpload is the name of the reactive form
acceptedImageTypes = {'image/png': true,'image/jpeg': true,'image/gif': true};
@ViewChild('imageDrop') imageDrop;
allowDrop(e) {
e.preventDefault();
}
drop(e) {
e.preventDefault();
//clear in case we selected something before via click
this.imageUpload.controls.imageInput.reset();
this.imageDrop.innerHTML="";
this.checkfiles(e.dataTransfer.files);
}
imageChange(event){
this.imageDrop.innerHTML="";
this.checkfiles(event.target.files);
}//imageChange
checkfiles(files){
if (this.acceptedImageTypes[files[0].type] !== true){
this.imageDrop.nativeElement.innerHTML="Not an image";
return;
}
else if (files.length>1){
this.imageDrop.nativeElement.innerHTML="Only one image/time";
return;
}
else { this.readfiles(files); }
}//checkfiles
readfiles(files){
const reader = new FileReader();
let image = new Image();
reader.onload = (event) =>{
this.imageDrop.nativeElement.innerHTML="";
let fileReader = event.target as FileReader;
image.src = fileReader.result;
image.width = 150;
this.imageDrop.nativeElement.appendChild(image);
};
reader.readAsDataURL(files[0]);
if (this.imageUpload.controls.imageInput.value==null) {
//if its null then means that we dragging an img, so the previous image from the input file is deleted
//now we got to put this image to the input file in order to submit the form
this.imageUpload.controls.imageInput.reset(files[0] );
}
}//readfiles
imageUploadSubmitted(){
//when form submit, for now just check image value to check if its the right one
console.log('IMAGE VALUE SUBMIT = = ',this.imageUpload.controls.imageInput.value);
}
Run Code Online (Sandbox Code Playgroud)
错误
当我尝试拖放图像时,我得到的ERROR DOMException: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string
指向此HTML行,<div id="imageDrop" (click)='imageInput.click()' (drop)="drop($event)" (dragover)="allowDrop($event)" #imageDrop>
但我确信它与
if (this.imageUpload.controls.imageInput.value==null) {
this.imageUpload.controls.imageInput.reset(files[0] );
}
Run Code Online (Sandbox Code Playgroud)
部分readfiles
功能.
任何想法如何解决这个问题,所以文件输入可以得到一个值,然后可以自由提交表单?
谢谢
好吧,给你错误的那条线是 this.imageUpload.controls.imageInput.setValue(files[0]);
原因是,浏览器将阻止您因安全问题以编程方式设置文件.
相反,您可以e.dataTransfer.files
直接使用:
let input = this.imageUpload.controls.imageInput as any;
input.files = files;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2214 次 |
最近记录: |