Angular中使用drag and drop实现文件拖拽上传,及flask后端接收

效果:拖拽文件到组件上面时 边框变大变红 松手后发送到服务器(或者点击蓝字手动选择文件)并且把文件名显示在框内,美化还没做




html

html 复制代码
<div class="drapBox">
    <div id="drop" (dragenter)="dragenter($event)" (dragover)="dragover($event)" (dragleave)="dragleave($event)"
        on-drop="drop($event)" [ngClass]="{'dragover':isdragover,'notdragover':!isdragover}">
        <div class="desc">Drag files here, or</div>
        <label for="file" class="input_desc">
            <input class="drag-message-input" type="file" id="file" name="file" on-change="inputFile($event)" />
            <span class="drag-message-manual">click to select</span>
        </label>
    </div>
    <div id="selectedFilesBox" class="absflex" *ngIf="selectedFilesName.length>0">
        <div class="allFileDesc">{{selectedFilesCount}} files selected:</div> 
        <div class="fileDesc" *ngFor="let item of selectedFilesName">{{item}}</div>
    </div>
</div>

Ts

javascript 复制代码
import { Component } from '@angular/core';
import { Observable, catchError, of, switchMap } from 'rxjs';
import { HttpClient } from '@angular/common/http';
@Component({
  selector: 'app-filedrag',
  templateUrl: './filedrag.component.html',
  styleUrls: ['./filedrag.component.css']
})
export class FiledragComponent {
  isdragover:boolean=false;
  selectedFilesName:string[]=[];
  selectedFilesCount:number = 0;
  constructor(private http: HttpClient){}
  dragover(e:Event){
    e.stopPropagation();
    e.preventDefault();
    this.isdragover=true;
    console.log("dragover");
  }
  dragleave(e:Event){
    e.stopPropagation();
    e.preventDefault();
    this.isdragover=false;
    console.log("dragleave");
  }
  dragenter(e:Event){
    e.stopPropagation();
    e.preventDefault();
    console.log("dragenter");
  }
  drop(e:any){
   e.stopPropagation();
   e.preventDefault();
   this.isdragover=false;
   let dataTransfer=e.dataTransfer;
   let files=dataTransfer.files;
   console.log("files:");
   console.log(files);
   this.showSelectedFiles(files);
   this.handleFiles(files).subscribe();
 }
 inputFile(e:any){
  console.log(e.target.files);
  this.showSelectedFiles(e.target.files);
  this.handleFiles(e.target.files).subscribe();
}
showSelectedFiles(files: FileList): void{
  this.selectedFilesName = [];
  this.selectedFilesCount = files.length;
  for(let i=0;i<files.length;i++){
    this.selectedFilesName.push(files[i].name);
  }

}
handleFiles(filesToUp: FileList): Observable<{message:string}> {
  const url: string = "http://127.0.0.1:5000/up_file";
  const formData: FormData = new FormData();
  for(let i=0;i<filesToUp.length;i++){
    formData.append('files', filesToUp[i]);
  }
  return this.http
    .post<any>(url, formData).pipe(
      switchMap((res: {message:string}) => { console.log(res); return of(res); }),
      catchError(er=>{console.log(er);return of({message:"error"})})
    );
}

}

Css

css 复制代码
.drapBox{
    position: relative;
    width: 300px;
    height: 300px;
}
#drop {
    position: absolute;
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 100;

}
.dragover{
    border: 2px dashed red;
    zoom:108%;
}
.notdragover{
    border: 2px dashed grey;
}


#file {
    display: none;
}
.desc{
    font-size: 1rem;
}
.input_desc {
    padding-left: 5px;
    font-size: 1rem;
    color: #4b87ff;
    cursor: pointer;
}
.absflex{
    position: absolute;
    width: 100%;
    height: 100%;
}
.allFileDesc{
    padding: 5px;
}
.fileDesc{
    display: inline-block;
    padding: 5px;
    border: 1px solid #4b87ff;
    font-style: italic;
    width: auto;
    height: 20px;
}

后端python flask代码一起贴上

python 复制代码
# -*- coding: utf-8 -*-
from flask import Flask,request
from flask import send_from_directory,render_template
from flask_cors import CORS

# r'/*' 是通配符,让本服务器所有的URL都允许跨域请求

app = Flask(__name__)
CORS(app, resources=r'/*')
@app.route("/up_file", methods=["POST", "GET"])
def file_receive():
    # try:
    files = request.files.getlist("files")
    print(files)
    if files is None:  # 表示没有发送文件
        return {
            'message': "failed"
        }
    else:
        return {
                   'message': "success"
        }
if __name__ == '__main__':
    app.run(debug=True)
相关推荐
颜酱5 分钟前
package.json 配置指南
前端·javascript·node.js
todoitbo10 分钟前
基于 DevUI MateChat 搭建前端编程学习智能助手:从痛点到解决方案
前端·学习·ai·状态模式·devui·matechat
oden16 分钟前
SEO听不懂?看完这篇你明天就能优化网站了
前端
IT_陈寒25 分钟前
React性能优化:这5个Hooks技巧让我减少了40%的重新渲染
前端·人工智能·后端
Sunhen_Qiletian25 分钟前
《Python开发之语言基础》第六集:操作文件
前端·数据库·python
珑墨26 分钟前
【唯一随机数】如何用JavaScript的Set生成唯一的随机数?
开发语言·前端·javascript·ecmascript
L***d67035 分钟前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
少云清36 分钟前
【功能测试】6_Web端抓包 _Fiddler抓包工具的应用
前端·功能测试·fiddler
豐儀麟阁贵44 分钟前
8.5在方法中抛出异常
java·开发语言·前端·算法
zengyuhan5031 小时前
Windows BLE 开发指南(Rust windows-rs)
前端·rust