From da24d69fa4c9d547141a58f828a177529061d4bf Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Tue, 16 Jun 2020 11:32:23 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=AE=8C=E5=96=84]=E4=B8=8A=E4=BC=A0=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=20=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/app/is-login.service.ts | 100 +-------- src/app/navigation/navigation.component.ts | 4 +- src/app/ui/all-file/all-file.component.html | 18 +- src/app/ui/all-file/all-file.component.ts | 226 ++++++++++++++++---- 5 files changed, 204 insertions(+), 146 deletions(-) diff --git a/package.json b/package.json index 931fb06..ad99b89 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve --proxy-config proxy.config.json --open --port 4100 ", + "start": "ng serve --proxy-config proxy.config.json --open --port 4300 ", "build": "ng build", "test": "ng test", "lint": "ng lint", diff --git a/src/app/is-login.service.ts b/src/app/is-login.service.ts index db2245d..5a99495 100644 --- a/src/app/is-login.service.ts +++ b/src/app/is-login.service.ts @@ -22,6 +22,7 @@ export class IsLoginService { let shardSize = 10 * 1024 * 1024 //文件大小是否大于10MB if (file && fileSize<=shardSize) { //<=10MB时直接下载 + this.downloadProgress = 70 this.http.get(`/api/Objects/drives/${file.objectName}`,{responseType: 'blob'},).subscribe(data=>{ let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址 @@ -75,103 +76,4 @@ export class IsLoginService { } - - - //上传文件 - objectName:any //上传对象名 - uploadisLoading:boolean = false //上传进度条显示 - uploadProgress:any = 0 - uploadId:any; //上传分块上传事件编号 - - filesTag:any = [] //每上传成功一个文件就往里面加一个标识 - //e是上传的文件 selectedDataBank是需要上传的地址 包括 XXX资料库 + 文件夹路径 - startUploading (e,selectedDataBank,result,reject,filesnum) { - let file = e || null //获取上传的文件 - let fileSize = file.size || null //上传文件的总大小 - let shardSize = 5 * 1024 * 1024 //5MB一个分片 - - if (file && fileSize<=shardSize) { //上传文件<=5MB时 - let formData = new FormData() - formData.append("file",file) - this.http.post(`/api/Objects/drives/${selectedDataBank}`,formData).subscribe((data:any)=>{ - this.objectName = data.objectName - - result("成功了") - - this.filesTag.push(data) - if(this.filesTag.length == filesnum){ - alert("文件夹全部上传完毕") - //当全部循环完毕重新加载列表 - // this.allfile.getALLFileList(selectedDataBank) - } - }) - } else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传 - let data = {filename: file.name} - this.uploadisLoading = true - this.http.post(`/api/NewMultipartUpload/drives/${selectedDataBank}`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传 - this.objectName = data.objectName - this.uploadId = data.uploadId - this.subsectionUploading(e,result,reject,filesnum) - }) - } - - } - - PartNumberETag:any=[]; //每次返回需要保存的信息 - //开始分段上传 - async subsectionUploading (e,result,reject,filesnum) { - let file = e || null //获取上传的文件 - let fileSize = file.size || null //上传文件的总大小 - let shardSize = 5 * 1024 * 1024 //5MB一个分片 - let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段 - let _result = result - for (let i = 0;i < allSlice;i++) { //循环分段上传 - let start = i * shardSize //切割文件开始位置 - let end = Math.min(fileSize, start + shardSize); //切割文件结束位置 - let formData = new FormData() - formData.append("file",file.slice(start, end)) - - //同步写法实现异步调用 - let result = await new Promise((resolve, reject) => { - // await 需要后面返回一个 promise 对象 - this.http.post(`/api/MultipartUpload/drives/${this.objectName}?uploadId=${this.uploadId}&partNumber=${i+1}`,formData).subscribe((data:any)=>{ - let msg = { - "partNumber":data.partNumber || null, - "eTag": data.eTag || null} - resolve(msg) // 调用 promise 内置方法处理成功 - }) - }); - this.PartNumberETag.push(result) - this.uploadProgress = Number((i/allSlice).toFixed(2))*100 - - if (this.PartNumberETag.length === allSlice) { - this.uploadProgress = 100 - this.endUploading(_result,reject,filesnum)} - }//for循环 - - } - - //完成分块上传 - endUploading (result,reject,filesnum) { - let data = this.PartNumberETag - let paramsData = {uploadId:this.uploadId} - - this.http.post(`/api/CompleteMultipartUpload/drives/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{ - - result("成功了") - - this.filesTag.push(data) - if(this.filesTag.length == filesnum){ - alert("文件夹全部上传完毕") - //当全部循环完毕重新加载列表 - // this.getALLFileList(this.selectedDataBank) - } - - this.uploadProgress = 0; - this.uploadisLoading = false - this.PartNumberETag =[] //清空保存返回的信息 - }) - } - - } diff --git a/src/app/navigation/navigation.component.ts b/src/app/navigation/navigation.component.ts index 8cafded..2acbb3c 100644 --- a/src/app/navigation/navigation.component.ts +++ b/src/app/navigation/navigation.component.ts @@ -83,11 +83,11 @@ export class NavigationComponent implements OnInit { getAllDataBank(){ this.http.get('/api/DataBanks').subscribe(data => { this.allDataBank = data - console.log(123,data) + // console.log(123,data) } , err=>{ - console.log(456,err) + // console.log(456,err) }) } //点击资料库 diff --git a/src/app/ui/all-file/all-file.component.html b/src/app/ui/all-file/all-file.component.html index fd432c8..9046e5d 100644 --- a/src/app/ui/all-file/all-file.component.html +++ b/src/app/ui/all-file/all-file.component.html @@ -20,7 +20,7 @@
create_new_folder 新建文件夹
-
+
save_alt 下载
@@ -29,24 +29,30 @@
- + 上传中... -
- +
+ +
+ + 文件夹上传中...(当前上传 {{uploadProgress2}} ) + +
+
下载中...
-
+
diff --git a/src/app/ui/all-file/all-file.component.ts b/src/app/ui/all-file/all-file.component.ts index 16ad0a9..5668f63 100644 --- a/src/app/ui/all-file/all-file.component.ts +++ b/src/app/ui/all-file/all-file.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit,ViewChild ,Inject} from '@angular/core'; +import { Component, OnInit,ViewChild ,Inject,NgZone } from '@angular/core'; import { SelectionModel } from '@angular/cdk/collections'; import {MatSort} from '@angular/material/sort'; import {MatTableDataSource} from '@angular/material/table'; @@ -15,8 +15,8 @@ import { async } from '@angular/core/testing'; export class AllFileComponent { displayedColumns: string[] = ['select', 'name', 'weight', 'time']; dataSource:any = new MatTableDataSource; - - constructor(private http: HttpClient,public snackBar: MatSnackBar,public downloadFile:IsLoginService,public dialog: MatDialog) { } + + constructor(private http: HttpClient,public snackBar: MatSnackBar,public downloadFile:IsLoginService,public dialog: MatDialog,private zone: NgZone) { } isCancel:boolean = false //搜索框的X是否显示 searchData:any = "搜索您的文件" //搜索框内容 isClickFile:boolean = false //是否点击过文件 @@ -82,7 +82,7 @@ export class AllFileComponent { params:paramsdata }).subscribe((data:any) => { - console.log(data) + // console.log(data) this.oldDataSource = data.contents //保存表格数据 data.contents.forEach((item)=>{ let typeArr = item.key.split('.') @@ -171,12 +171,12 @@ export class AllFileComponent { ); }else if(item.type == "pdf"){ - const config = new MatSnackBarConfig(); - config.verticalPosition = 'top'; - config.duration = 3000 - this.snackBar.open('该文件类型暂不支持在线查看,请下载查看','确定',config) + // const config = new MatSnackBarConfig(); + // config.verticalPosition = 'top'; + // config.duration = 3000 + // this.snackBar.open('该文件类型暂不支持在线查看,请下载查看','确定',config) // "/api/Objects/drives/" + this.data.url - // window.open("/api/Objects/drives/" + item.key) + window.open("/api/Objects/drives/" + item.key) // const dialogRef = this.dialog.open(ViewDetails, {//调用open方法打开对话框并且携带参数过去 // width: '1600px', // height:'900px', @@ -189,7 +189,6 @@ export class AllFileComponent { }else if (item.isDir) { this.selectedDataBank = item.key.substring(0, item.key.length - 1) this.getALLFileList(this.selectedDataBank) - }else{ const config = new MatSnackBarConfig(); config.verticalPosition = 'top'; @@ -252,7 +251,6 @@ export class AllFileComponent { //上传文件夹 async selectFiles (e) { this.fileArr = e.target.files || null //上传的文件 - let _this = this for (var i = 0;i < this.fileArr.length; i++) { let f = this.fileArr[i]; @@ -262,12 +260,151 @@ export class AllFileComponent { let filesnum = _this.fileArr.length let result = await new Promise ((result,reject)=>{ - this.downloadFile.startUploading(f,adddress,result,reject,filesnum) + this.startUploading2(f,adddress,result,reject,filesnum,this.selectedDataBank) }) } } + //上传文件 + objectName2:any //上传对象名 + uploadisLoading2:boolean = false //上传进度条显示 + uploadProgress2:any + uploadId2:any; //上传分块上传事件编号 + filesTag2:any = [] //每上传成功一个文件就往里面加一个标识 + //e是上传的文件 selectedDataBank是需要上传的地址 包括 XXX资料库 + 文件夹路径 + startUploading2 (e,selectedDataBank,result,reject,filesnum,selectedDataBank2) { + let file = e || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + this.uploadisLoading2 = true + this.uploadProgress2 = 0 + "/" + filesnum + + if (file && fileSize<=shardSize) { //上传文件<=5MB时 + // console.log(selectedDataBank) + let formData = new FormData() + formData.append("file",file) + this.http.post(`/api/Objects/drives/${selectedDataBank2}`,formData).subscribe((data:any)=>{ + this.objectName2 = data.objectName + this.filesTag2.push("data") + this.zone.run(() => { +   setTimeout(() => this.uploadProgress2 = this.filesTag2.length + "/" + filesnum, 0); + }); + result("成功了") + + if(this.filesTag2.length == filesnum){ + this.filesTag2 = [] //清空计数文件夹 + this.uploadProgress2 = filesnum + "/" + filesnum + this.uploadisLoading2 = false + + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('文件夹全部上传完毕','确定',config) + // 当全部循环完毕重新加载列表 + this.getALLFileList(selectedDataBank2) + } + }) + } else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传 + let data = {filename: file.name} + this.uploadisLoading2 = true + + this.http.post(`/api/NewMultipartUpload/drives/${selectedDataBank}`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传 + this.objectName2 = data.objectName + this.uploadId2 = data.uploadId + this.subsectionUploading2(e,result,reject,filesnum,selectedDataBank2) + }) + } + + } + + PartNumberETag2:any=[]; //每次返回需要保存的信息 + //开始分段上传 + async subsectionUploading2 (e,result,reject,filesnum,selectedDataBank2) { + let file = e || null //获取上传的文件 + let fileSize = file.size || null //上传文件的总大小 + let shardSize = 5 * 1024 * 1024 //5MB一个分片 + let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段 + let _result = result + for (let i = 0;i < allSlice;i++) { //循环分段上传 + let start = i * shardSize //切割文件开始位置 + let end = Math.min(fileSize, start + shardSize); //切割文件结束位置 + let formData = new FormData() + formData.append("file",file.slice(start, end)) + + //同步写法实现异步调用 + let result = await new Promise((resolve, reject) => { + // await 需要后面返回一个 promise 对象 + this.http.post(`/api/MultipartUpload/drives/${this.objectName2}?uploadId=${this.uploadId2}&partNumber=${i+1}`,formData).subscribe((data:any)=>{ + let msg = { + "partNumber":data.partNumber || null, + "eTag": data.eTag || null} + resolve(msg) // 调用 promise 内置方法处理成功 + }) + }); + this.PartNumberETag2.push(result) + if (this.PartNumberETag2.length === allSlice) { + this.endUploading2(_result,reject,filesnum,selectedDataBank2)} + }//for循环 + + } + + //完成分块上传 + endUploading2 (result,reject,filesnum,selectedDataBank2) { + let data = this.PartNumberETag2 + let paramsData = {uploadId:this.uploadId2} + + this.http.post(`/api/CompleteMultipartUpload/drives/${this.objectName2}`,data,{params:paramsData}).subscribe(data=>{ + + this.filesTag2.push("data") + this.zone.run(() => { +   setTimeout(() => this.uploadProgress2 = this.filesTag2.length + "/" + filesnum, 0); + }); + + + result("成功了") + + if(this.filesTag2.length == filesnum){ + + this.uploadProgress2 = filesnum + "/" + filesnum + this.uploadisLoading2 = false + + this.filesTag2 = [] //清空计数文件夹 + this.getALLFileList(selectedDataBank2) + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('文件夹全部上传完毕','确定',config) + + } + + this.PartNumberETag2 =[] //清空保存返回的信息 + }) + } + //取消分块上传 + cancel2 () { + this.http.delete(`/api/MultipartUpload/drives/${this.objectName2}?uploadId=${this.uploadId2}`).subscribe(data=>{ + this.uploadisLoading2= false + this.PartNumberETag2 =[] //清空保存返回的信息 + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('取消上传成功!','确定',config); + }) + } + + + + + + + + + + + + + @@ -284,8 +421,7 @@ export class AllFileComponent { config.duration = 3000 this.snackBar.open('新建文件夹成功','确定',config) }) - } //if - + } }); } @@ -374,17 +510,17 @@ export class AllFileComponent { //完成分块上传 endUploading () { - let data = this.PartNumberETag - let paramsData = {uploadId:this.uploadId} + let data = this.PartNumberETag; + let paramsData = {uploadId:this.uploadId}; this.http.post(`/api/CompleteMultipartUpload/drives/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{ - this.getALLFileList(this.selectedDataBank) + this.getALLFileList(this.selectedDataBank); this.uploadProgress = 0; - this.uploadisLoading = false - this.PartNumberETag =[] //清空保存返回的信息 + this.uploadisLoading = false; + this.PartNumberETag =[]; //清空保存返回的信息 const config = new MatSnackBarConfig(); config.verticalPosition = 'top'; - config.duration = 3000 - this.snackBar.open('上传成功','确定',config) + config.duration = 3000; + this.snackBar.open('上传成功','确定',config); }) } @@ -392,11 +528,11 @@ export class AllFileComponent { cancel () { this.http.delete(`/api/MultipartUpload/drives/${this.objectName}?uploadId=${this.uploadId}`).subscribe(data=>{ this.uploadProgress = 0; - this.uploadisLoading= false - this.PartNumberETag =[] //清空保存返回的信息 + this.uploadisLoading = false; + this.PartNumberETag = []; //清空保存返回的信息 const config = new MatSnackBarConfig(); config.verticalPosition = 'top'; - config.duration = 3000 + config.duration = 3000; this.snackBar.open('取消上传成功!','确定',config); }) } @@ -488,19 +624,33 @@ export class AllFileComponent { selectDownloadFile:any; //选择下载的文件 download:any; //下载文件元数据 downloadisLoading:boolean = false; //进度条loading加载 - downloadProgress:number=0; //进度条进度 + downloadProgress:number = 0; //进度条进度 downLoadFile(){ if (this.selection.selected.length === 1) { this.selectDownloadFile = this.selection.selected[0] - this.http.get('/api/ObjectMetadata/drives/' + this.selectDownloadFile.key).subscribe(data=>{ - this.download = data - this.downloadFile.download(this.download) - }) + if(this.selectDownloadFile.isDir){ + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('文件夹不支持下载','确定',config) + }else{ + this.http.get('/api/ObjectMetadata/drives/' + this.selectDownloadFile.key).subscribe(data=>{ + // console.log(data) + this.download = data + this.downloadFile.download(this.download) + }) + } + } else if (this.selection.selected.length>1) { const config = new MatSnackBarConfig(); config.verticalPosition = 'top'; config.duration = 3000 this.snackBar.open('暂时不支持批量下载','确定',config) + } else if (this.selection.selected.length == 0) { + const config = new MatSnackBarConfig(); + config.verticalPosition = 'top'; + config.duration = 3000 + this.snackBar.open('请选择要下载的文件','确定',config) } } @@ -547,15 +697,15 @@ export class FolderDialog { } ngOnInit(): void { - // var myDate = new Date(); - // var year = myDate.getFullYear(); - // var month = myDate.getMonth(); - // var day = myDate.getDate(); - // var hour = myDate.getHours(); //获取当前小时数(0-23) - // var minutes = myDate.getMinutes(); //获取当前分钟数(0-59) - // var seconds = myDate.getSeconds(); //获取当前秒数(0-59) - // var data = year + '' + month + day + hour + minutes + seconds - // this.newFolderName = "新建文件夹_" + data; + var myDate = new Date(); + var year = myDate.getFullYear(); + var month = myDate.getMonth(); + var day = myDate.getDate(); + var hour = myDate.getHours(); //获取当前小时数(0-23) + var minutes = myDate.getMinutes(); //获取当前分钟数(0-59) + var seconds = myDate.getSeconds(); //获取当前秒数(0-59) + var data = year + '' + month + day + hour + minutes + seconds + this.newFolderName = "新建文件夹_" + data; } onSubmit(value){