【问题标题】:Angular File Drag and Drop allow only single fileAngular File Drag and Drop 只允许单个文件
【发布时间】:2019-11-17 11:12:13
【问题描述】:

怎么可能只允许拖放文件?使用普通的上传按钮,它会受到限制,但拖放不起作用。

我唯一已知的解决方法是现在显示一个对话框,向用户显示他选择的所有文件并强制他选择其中一个。

【问题讨论】:

    标签: angular drag-and-drop


    【解决方案1】:

    通常,您有一个输入类型文件和一个可拖动区域,请参阅a stackblitz example

    <div draggable="true" ngClass="{{dragAreaClass}}">
        <div class="row">
            <div class="col-md-12 text-center">
                Drag files here
                <a href="javascript:void(0)" (click)="file.click()">
                    or click to open
                </a>
                <input type="file"
                       #file
                       [multiple]="false"
                       (change)="onFileChange($event)"
                       style="display:none" />
            </div>
            </div>
        </div>
        <div class="error" *ngIf="error">
            Only one file at time allow
        </div>
    

    您定义 .css 的位置

    .error {
        color: #f00;
    }
    
    .dragarea {
        font-size: 1.5rem;
        border: 3px solid #bbb;
        padding: 1.5rem;
        background-color: #fff;
        color: #bbb;
    }
    
    .droparea {
      font-size: 1.5rem;
      border: 3px dashed #bbb;
      padding: 1.5rem;
      background-color: #eff;
      color: #aaa;
    }
    

    并创建一个组件

      error: string;
      dragAreaClass: string;
      onFileChange(event: any) {
        let files: FileList = event.target.files;
        this.saveFiles(files);
      }
      ngOnInit() {
        this.dragAreaClass = "dragarea";
      }
      @HostListener("dragover", ["$event"]) onDragOver(event: any) {
        this.dragAreaClass = "droparea";
        event.preventDefault();
      }
      @HostListener("dragenter", ["$event"]) onDragEnter(event: any) {
        this.dragAreaClass = "droparea";
        event.preventDefault();
      }
      @HostListener("dragend", ["$event"]) onDragEnd(event: any) {
        this.dragAreaClass = "dragarea";
        event.preventDefault();
      }
      @HostListener("dragleave", ["$event"]) onDragLeave(event: any) {
        this.dragAreaClass = "dragarea";
        event.preventDefault();
      }
      @HostListener("drop", ["$event"]) onDrop(event: any) {
        this.dragAreaClass = "dragarea";
        event.preventDefault();
        event.stopPropagation();
        if (event.dataTransfer.files) {
          let files: FileList = event.dataTransfer.files;
          this.saveFiles(files);
        }
      }
    
      saveFiles(files: FileList) {
        if (files.length > 1) this.error = "Only one file at time allow";
        else {
          this.error = "";
          console.log(files[0].size,files[0].name,files[0].type);
    
          ..use a sevice to upload file...
        }
      }
    

    在函数 saveFiles 中可以检查“文件”的长度,其他可以检查的内容是扩展名、大小......

    【讨论】:

    • 我现在做了一些不同的事情,但它对我帮助很大。谢谢你。你知道为什么或如何改变输入的接受变量被拖放忽略吗?
    • 对不起,“输入的接受变量”你想说什么?
    • 我发现自己可以在文件已经删除时检查它。我的意思是文件类型。就像我只是希望用户只能删除/上传 csv 文件。
    • 您可以使用ext = files[0].name.toUpperCase().split('.').pop() || files[i].name 检查扩展名并与一个字符串数组进行比较,但这仅检查文件的扩展名,files[0].type 没有这么大的帮助所以链接说stackoverflow.com/questions/11832930/…
    • 我知道并且我正在使用它,但我的意思是当我将文件拖到字段上时甚至没有放下。但无论如何我实现了我想要的
    猜你喜欢
    • 2012-07-16
    • 2011-10-18
    • 2016-12-23
    • 1970-01-01
    • 2020-08-31
    • 2022-12-05
    • 2020-06-02
    • 2020-03-14
    • 2019-11-04
    相关资源
    最近更新 更多