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)
相关推荐
fishmemory7sec1 分钟前
Electron 使⽤ electron-builder 打包应用
前端·javascript·electron
豆豆1 小时前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
twins35202 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky2 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~2 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n03 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。3 小时前
案例-任务清单
前端·javascript·css
zqx_74 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己4 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5