Browse Source

[完善]token存储转为cookie存储, 文件分块上传,下载

develop
陈鹏飞 5 years ago
parent
commit
f263219f0f
  1. 8
      package-lock.json
  2. 1
      package.json
  3. 19
      src/app/app.component.ts
  4. 3
      src/app/app.module.ts
  5. 6
      src/app/auth.guard.ts
  6. 7
      src/app/http-interceptors/base-interceptor.ts
  7. 14
      src/app/http-interceptors/cache-token.service.ts
  8. 9
      src/app/pages/login/login.component.ts
  9. 14
      src/app/tabbar/tabbar.component.ts
  10. 4
      src/app/ui/function-division/function-division.component.html
  11. 12
      src/app/ui/function-division/function-division.component.ts
  12. 31
      src/app/ui/realistic-picture/realistic-picture.component.html
  13. 41
      src/app/ui/realistic-picture/realistic-picture.component.scss
  14. 20
      src/app/ui/realistic-picture/realistic-picture.component.ts
  15. 20
      src/app/ui/uploading-cad/uploading-cad.component.html
  16. 38
      src/app/ui/uploading-cad/uploading-cad.component.scss
  17. 194
      src/app/ui/uploading-cad/uploading-cad.component.ts

8
package-lock.json generated

@ -10137,7 +10137,8 @@
"inherits": {
"version": "2.0.4",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -11397,6 +11398,11 @@
"tslib": "^1.9.0"
}
},
"ngx-cookie-service": {
"version": "3.0.2",
"resolved": "https://registry.npm.taobao.org/ngx-cookie-service/download/ngx-cookie-service-3.0.2.tgz",
"integrity": "sha1-6N3jf5zqDjh3T+91j6NrcajC0wY="
},
"ngx-echarts": {
"version": "4.2.2",
"resolved": "https://registry.npm.taobao.org/ngx-echarts/download/ngx-echarts-4.2.2.tgz",

1
package.json

@ -31,6 +31,7 @@
"echarts": "^4.6.0",
"firebase": "^7.6.2",
"ng2-file-upload": "^1.4.0",
"ngx-cookie-service": "^3.0.2",
"ngx-echarts": "^4.2.2",
"ngx-perfect-scrollbar": "^8.0.0",
"rxjs": "~6.5.4",

19
src/app/app.component.ts

@ -3,6 +3,7 @@ import { HttpClient } from '@angular/common/http'
import { Data } from './interface'
import { Router,ActivatedRoute } from '@angular/router'
import {CacheTokenService} from './http-interceptors/cache-token.service'//引入服务
import { CookieService } from 'ngx-cookie-service';
@ -13,12 +14,13 @@ import {CacheTokenService} from './http-interceptors/cache-token.service'//引
})
export class AppComponent {
title = '数据采集管理平台';
time: number = 2*60*60*1000;// cookie过期时间两个小时 2*60*60*1000
constructor(private http:HttpClient,private router:Router,public token:CacheTokenService) { }
constructor(private http:HttpClient,private router:Router,public token:CacheTokenService,private cookieService: CookieService) { }
ngOnInit(): void {
var token = sessionStorage.getItem("token");
var refreshToken = sessionStorage.getItem("refreshToken");
var token = this.cookieService.get("token")
var refreshToken = this.cookieService.get("refreshToken");
if(token && refreshToken) {
this.http.post(
'/api/CompanyAccount/RefreshToken',
@ -28,9 +30,8 @@ export class AppComponent {
}
).subscribe(
(data: Data) => {
sessionStorage.setItem("realName",data.realName)
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.cookieService.set("token",data.token,new Date(new Date().getTime() + this.time),'/');
this.cookieService.set("refreshToken",data.refreshToken,new Date(new Date().getTime() + this.time),'/');
this.token.startUp()
console.log('已重启定时器')
}
@ -38,6 +39,8 @@ export class AppComponent {
}
}
}

3
src/app/app.module.ts

@ -17,6 +17,7 @@ import { HttpClientModule } from '@angular/common/http';
import { httpInterceptorProviders } from './http-interceptors/index'
import {CacheTokenService} from './http-interceptors/cache-token.service'
import { TreeService } from'./http-interceptors/tree.service'
import { CookieService } from 'ngx-cookie-service';//cookie插件
@NgModule({
declarations: [
@ -36,7 +37,7 @@ import { TreeService } from'./http-interceptors/tree.service'
FormsModule,
HttpClientModule
],
providers: [httpInterceptorProviders, CacheTokenService,TreeService],
providers: [httpInterceptorProviders, CacheTokenService,TreeService,CookieService],
bootstrap: [AppComponent]
})
export class AppModule { }

6
src/app/auth.guard.ts

@ -1,12 +1,14 @@
import { Component, OnInit, Inject } from '@angular/core';
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { CookieService } from 'ngx-cookie-service';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private router: Router) {
constructor(private router: Router,private cookieService: CookieService) {
}
@ -19,7 +21,7 @@ export class AuthGuard implements CanActivate {
checkLogin(): boolean {
// 判断本地有没有token
const token = sessionStorage.getItem('token');
const token = this.cookieService.get("token");
// 如果有token,允许访问
if (token) { return true; }

7
src/app/http-interceptors/base-interceptor.ts

@ -9,6 +9,7 @@ import { Router,ActivatedRoute } from '@angular/router'
import {CacheTokenService} from './cache-token.service'
import { MatSnackBar } from '@angular/material/snack-bar';
import { CookieService } from 'ngx-cookie-service';
//baseurl
// const baseurl = 'http://39.106.78.171:8008';
@ -17,7 +18,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
export class BaseInterceptor implements HttpInterceptor {
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,
public snackBar: MatSnackBar) {}
public snackBar: MatSnackBar,private cookieService: CookieService) {}
intercept(req, next: HttpHandler) {
@ -26,7 +27,7 @@ export class BaseInterceptor implements HttpInterceptor {
});
if(!req.cancelToken) {
/*获取token*/
let token = sessionStorage.getItem("token")
let token = this.cookieService.get("token")
/*此处设置额外请求头,token令牌*/
newReq.headers =
newReq.headers.set('Authorization', `Bearer ${token}`)
@ -49,6 +50,8 @@ export class BaseInterceptor implements HttpInterceptor {
this.token.delete()
sessionStorage.clear()
window.localStorage.clear()
this.cookieService.set("token",'',new Date(new Date().getTime() + 1),'/')
this.cookieService.set("refreshToken",'',new Date(new Date().getTime() + 1),'/')
this.snackBar.open('用户认证信息过期,请重新登录', '确定', {
duration: 3000
});

14
src/app/http-interceptors/cache-token.service.ts

@ -1,5 +1,6 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { CookieService } from 'ngx-cookie-service';
@Injectable({
providedIn: 'root'
@ -7,9 +8,11 @@ import { HttpClient } from '@angular/common/http'
export class CacheTokenService {
constructor(private http:HttpClient) { }
constructor(private http:HttpClient,private cookieService: CookieService) { }
public timer;
public settime = null;
time: number = 2*60*60*1000;// cookie过期时间两个小时 2*60*60*1000
//刷新token令牌定时器
startUp = ():void=>{
@ -17,8 +20,8 @@ export class CacheTokenService {
this.timer = window.setInterval(
()=>{
window.clearInterval(this.settime)
var token = sessionStorage.getItem("token");
var refreshToken = sessionStorage.getItem("refreshToken");
var token = this.cookieService.get("token");
var refreshToken = this.cookieService.get("refreshToken");
this.http.post(
'/api/CompanyAccount/RefreshToken',
{
@ -28,9 +31,8 @@ export class CacheTokenService {
).subscribe(
(data:any) => {
console.log(data)
sessionStorage.setItem("realName",data.realName)
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.cookieService.set("token",data.token,new Date(new Date().getTime() + this.time),'/');
this.cookieService.set("refreshToken",data.refreshToken,new Date(new Date().getTime() + this.time),'/');
}
)
}

9
src/app/pages/login/login.component.ts

@ -3,6 +3,7 @@ import { HttpClient } from '@angular/common/http'
import { Data } from '../../interface'
import { Router,ActivatedRoute } from '@angular/router'
import {CacheTokenService} from '../../http-interceptors/cache-token.service'//引入服务
import { CookieService } from 'ngx-cookie-service';//cookie插件
import { MatSnackBar } from '@angular/material/snack-bar';
@ -16,11 +17,12 @@ import { MatSnackBar } from '@angular/material/snack-bar';
export class LoginComponent implements OnInit {
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,
public snackBar: MatSnackBar) { }
public snackBar: MatSnackBar,private cookieService: CookieService) { }
ngOnInit() {}
errmsg :string = ''; //错误信息
time: number = 2*60*60*1000;// cookie过期时间两个小时 2*60*60*1000
//提交登录表单
onSubmit(e){
@ -29,9 +31,8 @@ export class LoginComponent implements OnInit {
password: e.password}).subscribe(
(data: Data) =>
{
sessionStorage.setItem("realName",data.realName)
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.cookieService.set("token",data.token,new Date(new Date().getTime() + this.time),'/');
this.cookieService.set("refreshToken",data.refreshToken,new Date(new Date().getTime() + this.time),'/');
this.router.navigate(['/datacollection/basicinfo'])
//调用服务中的function刷新token

14
src/app/tabbar/tabbar.component.ts

@ -6,6 +6,7 @@ import {CacheTokenService} from '../http-interceptors/cache-token.service'//引
import { MatDialog } from '@angular/material/dialog';
import {ChangepasswordComponent} from '../ui/changepassword/changepassword.component'
import { MatSnackBar } from '@angular/material/snack-bar';
import { CookieService } from 'ngx-cookie-service';
@ -29,10 +30,11 @@ export class TabbarComponent implements OnInit {
onChange(eventValue: boolean){
this.toggleDarkTheme.emit(eventValue);
}
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,public dialog: MatDialog,public snackBar: MatSnackBar) { }
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,public dialog: MatDialog,public snackBar: MatSnackBar,
private cookieService: CookieService) { }
ngOnInit() {
this.companyName = sessionStorage.getItem("realName");
this.getUserInfo()
}
boxed(css){
@ -84,6 +86,12 @@ export class TabbarComponent implements OnInit {
}
companyName:any; //企业name
//获取用户信息
getUserInfo () {
this.http.get('/api/CompanyAccount/Profiles').subscribe((data:any)=>{
this.companyName = data.companyName
})
}
//退出系统
signOut = () => {
@ -94,6 +102,8 @@ export class TabbarComponent implements OnInit {
this.token.delete()
sessionStorage.clear()
window.localStorage.clear()
this.cookieService.set("token",'',new Date(new Date().getTime() + 1),'/');
this.cookieService.set("refreshToken",'',new Date(new Date().getTime() + 1),'/');
this.snackBar.open('成功退出', '确定', {
duration: 3000
});

4
src/app/ui/function-division/function-division.component.html

@ -8,8 +8,8 @@
<mat-tab label="单位功能分区">
<div style="margin: 30px 0 25px 50px;">
<mat-icon title="创建" (click)='addPartitionAttribute()'>add_circle_outline</mat-icon>
<mat-icon title="保存" style="margin-left: 25px;">description</mat-icon>
<mat-icon title="删除" style="margin-left: 25px;">delete</mat-icon>
<mat-icon title="保存" style="margin-left: 25px;" (click)='preservation()'>description</mat-icon>
<mat-icon title="删除" style="margin-left: 25px;" (click)='delete()'>delete</mat-icon>
</div>
<table mat-table [dataSource]="dataSource" style="margin-left: 50px;">

12
src/app/ui/function-division/function-division.component.ts

@ -34,6 +34,18 @@ export class FunctionDivisionComponent implements OnInit {
dialogRef.afterClosed().subscribe();
}
//保存功能分区属性
preservation () {
}
//删除功能分区属性
delete () {
}
}

31
src/app/ui/realistic-picture/realistic-picture.component.html

@ -21,12 +21,13 @@
<div class="topBox">
<div>
<span class="title" *ngIf="selectReal">{{selectReal.name}}</span>
<button mat-raised-button color="primary" class="uploadFileFixed">
<button mat-raised-button color="primary" class="uploadFileFixed" *ngIf="!isLoading">
上传图片
<input type="file" class="uploadFile" (change)='uploadFile($event)' ng2FileSelect [uploader]="uploader">
</button>
<button mat-raised-button color="primary" style="margin-left: 15px;" (click)='download()'>批量下载</button>
<button mat-raised-button color="primary" style="margin-left: 15px;" *ngIf="isDownload">下载</button>
<mat-spinner *ngIf="isLoading" diameter=25 class="isLoading"></mat-spinner>
<span style="margin-left: 15px;color: red;font-size: 12px;" *ngIf="isDownload">*现为批量下载状态,如需预览图片,请关闭批量下载</span>
</div>
<div>
@ -36,15 +37,27 @@
</div>
<div class="bottomBox">
<div class="imgBox">
<mat-icon class="checkedImg">check_circle</mat-icon>
<div class="fixedImg"><img src="../../../assets/images/upload.png" (click)='operation()'></div>
<label style="margin-left: 5px;">图片名称:</label>
<input type="text" style="margin-left: 10px;">
<a href="javascript:" style="margin-left: 5px;">保存</a>
<a href="javascript:" style="margin-left: 5px;">删除</a>
<div class="imgsBoxflex">
<div class="imgBox">
<mat-icon class="checkedImg">check_circle</mat-icon>
<div class="fixedImg"><img src="../../../assets/images/upload.png" (click)='operation()'></div>
<label style="margin-left: 5px;">图片名称:</label>
<input type="text" style="margin-left: 10px;">
<a href="javascript:" style="margin-left: 5px;">保存</a>
<a href="javascript:" style="margin-left: 5px;">删除</a>
</div>
<div class="imgBox">
<mat-icon class="checkedImg">check_circle</mat-icon>
<div class="fixedImg"><img src="../../../assets/images/bg_login.jpg" (click)='operation()'></div>
<label style="margin-left: 5px;">图片名称:</label>
<input type="text" style="margin-left: 10px;">
<a href="javascript:" style="margin-left: 5px;">保存</a>
<a href="javascript:" style="margin-left: 5px;">删除</a>
</div>
</div>
</div>
</div>
</div>

41
src/app/ui/realistic-picture/realistic-picture.component.scss

@ -26,9 +26,13 @@
.bottomBox {
flex: 95%;
padding: 5px 0 0 25px;
display: flex;
flex-direction: row;
flex-wrap: wrap;}
overflow: auto;
.imgsBoxflex {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
}
}
}
@ -64,18 +68,13 @@
text-align: center;
margin-bottom: 3px;
img {
width: 100px;
height: 100px;
width: auto;
height: auto;
max-width: 100%;
height: 100%;
cursor:pointer;
}
}
.checkedImg {
position: absolute;
top: 1px;
right: 1px;
color:#00FF00;
font-size: 30px;
}
input{
font-size:12px;
width: 100px;
@ -106,13 +105,18 @@
.uploadFile {
opacity:0;
display: inline-block;
width: 86px;
height: 34px;
width: 88px;
height: 36px;
position: absolute;
top: 0px;
left: 0px;
}
}
.isLoading{
display: inline-block;
margin-left: 15px;
top: 8px;
}
//左侧实景图文件样式
.leftFile {
@ -124,7 +128,14 @@
filter: drop-shadow(0px 0px 5px #000);
border: 3px dotted red;
}
//旋转角度
.checkedImg {
position: absolute;
top: 1px;
right: 1px;
color:#00FF00;
font-size: 30px;
}
//预览图片旋转角度
.rotateA {transform: rotate(90deg) scale(0.75);}
.rotateB {transform: rotate(180deg)}
.rotateC {transform: rotate(270deg) scale(0.75);}

20
src/app/ui/realistic-picture/realistic-picture.component.ts

@ -1,7 +1,7 @@
import { Component, OnInit, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { FileUploader, FileItem } from 'ng2-file-upload';
import { FileUploader } from 'ng2-file-upload';
import Swiper from 'swiper';
@ -24,17 +24,17 @@ export class RealisticPictureComponent implements OnInit {
constructor(private http:HttpClient,public dialog: MatDialog) { }
ngOnInit(): void {
console.log(sessionStorage.getItem('realName'))
}
allRealPicture:any=[{name:'单位实景图'},{name:'高科技创业园'}]; //所有实景图文件
selectReal:any; //选中的实景图文件
selectRealIndex:any=0; //选中的实景图文件下标
miniImg:'?x-oss-process=image/resize,m_fill,h_100,w_100'; //缩略图片格式
miniImg:'?x-oss-process=image/resize,m_fill,h_300,w_170'; //缩略图片格式
isDownload:boolean = false; //是否批量下载
downloadList:any = []; //选中需要下载的图片
//切换左侧实图文件
//切换左侧实图文件
changeReal (e,index) {
if (this.selectRealIndex != index) {
this.selectReal = e
@ -77,6 +77,7 @@ export class RealisticPictureComponent implements OnInit {
isLoading:boolean = false; //loading加载
//上传文件↓
file:any; //上传的文件
objectName:any; //上传对象名
@ -95,17 +96,22 @@ export class RealisticPictureComponent implements OnInit {
let shardSize = 5 * 1024 * 1024 //5MB一个分片
if (file && fileSize<=shardSize) { //上传文件<=5MB时
this.isLoading = true
this.uploader.queue[0].upload();//开始上传
this.uploader.queue[0].onSuccess = (response, status, headers) => {
if (status == 201) { // 上传文件成功,上传文件后获取服务器返回的数据
let tempRes = JSON.parse(response);
console.log(tempRes)
this.isLoading = false
alert('图片上传成功!')
}else { // 上传文件后获取服务器返回的数据错误
let tempRes = JSON.parse(response);
console.log(tempRes)
console.log(tempRes)
this.isLoading = false
}};
} else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传
let data = {filename: file.name}
this.isLoading = true
this.http.post(`/api/NewMultipartUpload/PlanPlatform/YYY`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传
this.objectName = data.objectName
this.uploadId = data.uploadId
@ -150,9 +156,11 @@ export class RealisticPictureComponent implements OnInit {
let data = this.PartNumberETag
let paramsData = {uploadId:this.uploadId}
this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{
alert('图片上传成功!')
this.isLoading = false
this.file = null //清空文件
this.uploader.clearQueue(); //清空input控件文件
this.PartNumberETag =[] //清空保存返回的信息
alert('图片上传成功!')
})
}

20
src/app/ui/uploading-cad/uploading-cad.component.html

@ -1,10 +1,22 @@
<div class="header">
<div>
<button mat-raised-button color="primary">上传</button>
<button mat-raised-button color="primary">下载</button>
<button mat-raised-button color="primary">删除</button>
<button mat-raised-button color="primary" class="uploadFileFixed" *ngIf="!uploadisLoading">
上传
<input type="file" class="uploadFile" (change)='uploadFile($event)' ng2FileSelect [uploader]="uploader">
</button>
<button mat-raised-button color="primary" (click)='readFile()' *ngIf="!downloadisLoading">下载</button>
<button mat-raised-button color="primary" style="margin-right: 25px;">删除</button>
<div class="progressBox" *ngIf="uploadisLoading">
<button mat-raised-button style="margin-right: 5px;" (click)="cancel()">取消上传</button>
<span style="font-size: 12px;">上传中...</span>
<mat-progress-bar mode="determinate" [value]="progress" class="uploadProgress"></mat-progress-bar>
</div>
<div class="progressBox" *ngIf="downloadisLoading">
<button mat-raised-button style="margin-right: 5px;">取消下载</button>
<span style="font-size: 12px;">下载中...</span>
<mat-progress-bar mode="determinate" [value]="downloadProgress" class="downloadProgress"></mat-progress-bar>
</div>
</div>
<input required id="selectedfile" type="file" ng2FileSelect [uploader]="uploader" (change)="filechange($event)" name="CADFile">
<div>
<span>已用/容量:</span>
<span style="color: red;"> 500MB/5G </span>

38
src/app/ui/uploading-cad/uploading-cad.component.scss

@ -3,19 +3,43 @@
margin: 10px;
:first-child{flex:88%}
:last-child{flex:12%}
.mat-raised-button {
margin-left: 15px;
}
}
.uploadFileFixed {
position: relative;
#selectedfile{
.uploadFile {
opacity:0;
display: inline-block;
width: 64px;
height: 34px;
height: 36px;
position: absolute;
left: 15px;
opacity: 0;
top: 0px;
left: 0px;
}
}
.mat-raised-button {
margin-left: 15px;
}
.progressBox{
position: relative;
display: inline-block;
width: 500px;
}
//上传进度条
.uploadProgress{
position: absolute;
width: 300px;
top: 18px;
left: 160px;
}
//下载进度条
.downloadProgress {
position: absolute;
width: 300px;
top: 18px;
left: 160px;
}
table {
margin: 10px;
width: 100%;

194
src/app/ui/uploading-cad/uploading-cad.component.ts

@ -1,5 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { FileUploader } from 'ng2-file-upload';
@ -10,6 +11,14 @@ import { HttpClient } from '@angular/common/http';
})
export class UploadingCADComponent implements OnInit {
uploader:FileUploader = new FileUploader({ //初始化上传文件
url: "/api/Objects/PlanPlatform",
method: "POST",
itemAlias: "uploadedfile",
autoUpload: false,
removeAfterUpload:true,
});
constructor(private http:HttpClient,) { }
ngOnInit(): void {
@ -18,12 +27,191 @@ export class UploadingCADComponent implements OnInit {
displayedColumns: string[] = ['checked', 'name', 'time', 'state','size'];
dataSource:any; //所有CAD图
//选择文件
filechange(e){
//上传文件↓
file:any; //上传的文件
uploadisLoading:boolean = false; //进度条loading加载
progress:number=0; //进度条进度
objectName:any; //上传对象名
uploadId:any; //上传分块上传事件编号
//change选择文件
uploadFile (e) {
this.file = e.target.files[0] || null //上传的文件
this.startUploading()
}
//上传文件
uploader(){
startUploading () {
let file = this.file || null //获取上传的文件
let fileSize = file.size || null //上传文件的总大小
let shardSize = 5 * 1024 * 1024 //5MB一个分片
if (file && fileSize<=shardSize) { //上传文件<=5MB时
this.uploader.queue[0].upload();//开始上传
this.uploader.queue[0].onSuccess = (response, status, headers) => {
if (status == 201) { // 上传文件成功,上传文件后获取服务器返回的数据
let tempRes = JSON.parse(response);
console.log(tempRes)
alert('上传成功!')
}else { // 上传文件后获取服务器返回的数据错误
let tempRes = JSON.parse(response);
console.log(tempRes)
}};
} else if (file && fileSize>shardSize) { //上传文件>5MB时,分块上传
let data = {filename: file.name}
this.uploadisLoading = true
this.http.post(`/api/NewMultipartUpload/PlanPlatform/YYY`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传
this.objectName = data.objectName
this.uploadId = data.uploadId
this.subsectionUploading()
})
}
}
PartNumberETag:any=[]; //每次返回需要保存的信息
//开始分段上传
async subsectionUploading () {
let file = this.file || null //获取上传的文件
let fileSize = file.size || null //上传文件的总大小
let shardSize = 5 * 1024 * 1024 //5MB一个分片
let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段
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/PlanPlatform/${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.progress = Number((i/allSlice).toFixed(2))*100
if (this.PartNumberETag.length === allSlice) {
this.progress = 100
this.endUploading()}
}//for循环
}
//完成分块上传
endUploading () {
let data = this.PartNumberETag
let paramsData = {uploadId:this.uploadId}
this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{
this.progress = 0;
this.uploadisLoading = false
this.file = null //清空文件
this.uploader.clearQueue(); //清空input控件文件
this.PartNumberETag =[] //清空保存返回的信息
alert('上传成功!')
})
}
//取消分块上传
cancel () {
this.http.delete(`/api/MultipartUpload/PlanPlatform/${this.objectName}?uploadId=${this.uploadId}`).subscribe(data=>{
this.progress = 0;
this.uploadisLoading= false
this.file = null //清空文件
this.uploader.clearQueue(); //清空input控件文件
this.PartNumberETag =[] //清空保存返回的信息
alert('取消上传成功!')
})
}
//下载↓
download:any = 'PlanPlatform/YYY/5e6f10f8504aeb36d43cf5e1.jpg'; //下载的文件
downloadisLoading:boolean = false; //进度条loading加载
downloadProgress:number=0; //进度条进度
//读取下载文件信息
readFile () {
this.http.get('/api/ObjectMetadata/'+this.download).subscribe(data=>{
this.download = data
this.downloadFile()
})
}
//初始化下载
downloadFile () {
let file = this.download
let fileSize = file.fileLength//下载文件的总大小
let shardSize = 10 * 1024 * 1024 //文件大小是否大于10MB
if (file && fileSize<=shardSize) { //<=10MB时直接下载
this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{responseType: 'blob'},).subscribe(data=>{
let url = window.URL.createObjectURL(new Blob([data])); //new Blob创建一个下载Blob的url地址
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", file.fileName);
document.body.appendChild(link);
link.click();
})
} else if (file && fileSize>shardSize) { //>10MB时分块下载
this.blockingDownload() //分段下载
this.downloadisLoading = true
}
}
//分段下载并合并
async blockingDownload () {
let file = this.download
let fileSize = file.fileLength //下载文件的总大小
let shardSize = 3 * 1024 * 1024 //3MB一个分片
let allSlice = Math.ceil(fileSize / shardSize) //总文件/3MB===共分多少段
let allFile:any = [] //所有的file分段
for (let i=0;i<allSlice;i++) {
let start = i * shardSize //每次下载文件开始位置
let end = Math.min(fileSize, start + shardSize-1); //每次下载文件结束为止
let result = await new Promise ((result,reject)=>{
this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{headers:{'range':`bytes= ${start}-${end}`},responseType:'blob'}).subscribe(data=>{
result(data) })
})
allFile.push(result)
this.downloadProgress = Number((i/allSlice).toFixed(2))*100
if (allFile.length === allSlice) { //合并文件输出给浏览器
let url = window.URL.createObjectURL(new Blob(allFile)); //new Blob创建一个下载Blob的url地址
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", file.fileName);
document.body.appendChild(link);
link.click();
this.downloadisLoading = false
this.download = 'PlanPlatform/YYY/5e6f10f8504aeb36d43cf5e1.jpg'
}
} //for循环
}
}

Loading…
Cancel
Save