后端服务使用的是Asp.net WebApi,至于如果有环境搭建或者怎么引入上传控件这一类的问题,请自行百度,都有手册多看几遍。

在此记录的是核心的一些代码,没有给出界面UI,因为重点是给出思路和怎么用

1.页面引入nz-upload

1.我们在Angular页面引入控件,主要介绍2个重要的属性,其他的建议读下手册

  • 1.1. nzFileList的值就是双向绑定的文件列表,就是最终需要传到后端的,你如果需要展示那也可以取这里的值
  • 1.2. nzBeforeUpload 一定要使用箭头函数箭头函数箭头函数,不要问为什么重复,踩过坑的,上传之前执行的事件
<nz-upload [nzAction]="''" [(nzFileList)]="fileList" nzMultiple [nzLimit]="0" [nzShowUploadList]="false"
[nzBeforeUpload]="beforeUpload">
<button [disabled]="false" nz-button nzType="primary" nz-popover nzPopoverContent="Upload File">
<i nz-icon nzType="upload"></i>
</button>
</nz-upload>
2.钩子事件和上传事件

1.钩子事件就是上传事件之前执行的事件,可以做一些校验等操作,当然你也可以写在上传事件中,随处可见的AOP

fileList: NzUploadFile[] = [];
beforeUpload = (file: NzUploadFile): boolean => {
//判断文件大小
const isLt4M = file.size! / 1024 / 1024 < 4;
if (!isLt4M) {
this.message.error('Message.File.SizeFile');
return false;
}
this.fileList = this.fileList.concat(file);
return true;
}

2.上传事件用于将文件信息提交到后端

async handleUpload() {
const formData = new FormData();
//将文件绑定到FormData中
this.fileList.forEach((file: any) => {
formData.append("files[]", file);
}); //给后端文件服务标识来源于什么系统
formData.append("system", "OA");
//给后端文件服务标识是什么类型的附件
formData.append('annexType', "附件类型"); //使用Post调用文件服务
this.httpclient.post<any>("192.168.0.105/api/FileServer/UploadFile", formData).toPromise();
}
3.下载文件

1.定义下载对象,然后调用后端下载api接口


downLoadFile(file: Attachment): void {
const DownloadRequest = {
FileFullPath: 文件服务器摘要返回的文件路径,
FileId: 文件服务器摘要返回的文件ID,
FullFileName: 文件服务器摘要返回的文件名称,
}; let head = new HttpHeaders({ 'Content-Type': 'application/json' });
//调用文件下载服务
this.httpclient.post<any>("192.168.0.105/api/FileServer/DownloadFile",DownloadRequest,{ headers: head, responseType: 'arraybuffer' }).subscribe(
(result) => {
if ('msSaveOrOpenBlob' in navigator) {
const nav = window.navigator as any;
nav.msSaveOrOpenBlob(
new Blob([]),
DownloadRequest.FullFileName
);
return;
} else {
const url = window.URL.createObjectURL(new Blob([result]));
const link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', DownloadRequest.FullFileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
return url;
}
})
4.后端WebAPI服务
  1. 在这里实现思路为文件服务器保存文件,并生成文件一对一的摘要信息,返回到客户端,客户端收到上传成功的摘要信息,然后将摘要Id与业务数据绑定,存到业务数据库,下次加载数据,根据摘要Id来找到对应的文件信息,然后访问文件服务器下载文件。

  2. 这里暂时不考虑,如果多个文件是否完整上传,中间有失败的情况,为了服务器安全,后端和前端应适当过滤筛选出一些不能被上传的文件后缀,例如DLL exe这些,这只是个小建议,当然您可以使用,你所喜欢的任何文件服务中间件,作为你的文件服务器

3.控制器中接收文件上传内容,存入本地磁盘文件夹,然后返回文件信息的摘要包含如下

  • 文件对应生成的唯一id
  • 文件存储文件夹路径
  • 文件内容长度
  • 文件后缀名
  • 文件是否被压缩

控制器接收

[HttpPost]
[Route("api/FileServer/UploadFile")]
public HttpResponseMessage UploadFile()
{
HttpRequest httpRequest = HttpContext.Current.Request;
string config = httpRequest.Params["system"].Trim();
string annexType = httpRequest.Params["annexType"].Trim(); if (string.IsNullOrEmpty(config) || string.IsNullOrEmpty(annexType))
{
return Request.CreateResponse(HttpStatusCode.BadRequest, "config and annexType is required.");
} string FilePath = ConfigurationManager.AppSettings[config];
var filePath = HttpContext.Current.Server.MapPath(FilePath + annexType) + "\\";
if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); return UploadFileHandler(httpRequest,filePath);
}

文件处理方法

 [NonAction]
public HttpResponseMessage UploadFileHandler(HttpRequest httpRequest, string filePath)
{
try
{
HttpResponseMessage result = null;
if (httpRequest.Files.Count > 0)
{
//文件信息的摘要
List<FileData> ResponseData = new List<FileData>();
for (int i = 0; i < httpRequest.Files.Count; i++)
{
FileData fileData = new FileData();
var postedFile = httpRequest.Files[i];
string guid = Guid.NewGuid().ToString().ToUpper();
//一个一个文件保存到本地磁盘
postedFile.SaveAs(filePath + guid);
fileData.FileId = guid;
fileData.FullFileName = postedFile.FileName;
fileData.FileFullPath = filePath + guid;
fileData.ContentLength = postedFile.ContentLength;
fileData.Extension = postedFile.FileName.Substring(postedFile.FileName.LastIndexOf('.'));
fileData.isZipFile = false;
ResponseData.Add(fileData);
}
result = Request.CreateResponse(HttpStatusCode.Created, ResponseData);
}
else
{
result = Request.CreateResponse(HttpStatusCode.BadRequest);
}
return result;
}
catch (Exception e)
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.ReasonPhrase = e.Message;
return response;
}
}

2.下载文件服务

[HttpPost]
[Route("api/FileServer/DownloadFile")]
public HttpResponseMessage DownloadFile(DownloadRequest request)
{
try
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(request.FileFullPath);
if (!fileInfo.Exists)
{
response = new HttpResponseMessage(HttpStatusCode.NotFound);
response.ReasonPhrase = "File does not exists.";
return response;
}
FileStream stream = new FileStream(request.FileFullPath, FileMode.Open); response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/force-download");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = HttpUtility.UrlEncode(request.FullFileName)
};
response.Headers.Add("Access-Control-Expose-Headers", "FileName");
response.Headers.Add("FileName", HttpUtility.UrlEncode(request.FullFileName));
return response;
}
catch (Exception e)
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.ReasonPhrase = e.Message;
return response;
}
}

NG-ZORRO中Upload上传控件使用的更多相关文章

  1. vue+ElementUI项目中,上传控件为必填项,上传图片后清空提示信息

    (ps:以下是我在项目中遇到得问题及解决方法,希望对你们有帮助.如果还有其他方法,可以留言,谢谢) 一个表单页面,使用element-ui中el-upload上传图片,此项为必填项,然后写了校验规则, ...

  2. Upload无刷新上传控件

    Upload无刷新上传控件 最近在做一个web开发项目 ,用到upload上传控件 ,由于c#提供的控件局限性太大 ,所以就自己从国外大牛 手里借鉴一下. 该控件可以判断上传的文件是否已存在 ,减少了 ...

  3. 用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮

    需求 有这么一个需求,一个form有多个文件要上传,但又不是传统的图片批量上传那种,是类似下图这种需求,一开始是用的swfupload做的上传,但是问题是如果有多个按钮的话,就要写很多重复的代码,于为 ...

  4. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)

    引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...

  5. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 基于AngularJs的上传控件-angular-file-upload

    今天跟大家分享的是一个依赖于angular的上传控件. 前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用 ...

  8. jquery文件上传控件 Uploadify

    (转自 http://www.cnblogs.com/mofish/archive/2012/11/30/2796698.html) 基于jquery的文件上传控件,支持ajax无刷新上传,多个文件同 ...

  9. 使用Uploadify(UploadiFive)多文件上传控件遇到的坑

    最近项目中需要实现多文件上传功能,于是结合需求最终选择了Uploadify这一款控件来实现.相比其他控件,Uploadify具有简洁的界面,功能API基本可以解决大多数需求,又是基于jquery的,配 ...

  10. Extjs3 + swfUpload实现多文件上传控件

    要在ExrtJS框架实现选择多文件上传,FileUploadField已经无法满足需求,所以采用了 swfUpload上传控件,上传窗口如下: 多选文件进行上传(其实是每个文件异步上传),可以中途停止 ...

随机推荐

  1. .NET 原生驾驭 AI 新基建实战系列(七):Weaviate ── 语义搜索的智能引擎创新者

    引言 随着人工智能和机器学习技术的迅猛发展,向量数据在推荐系统.自然语言处理.图像搜索等领域的应用日益广泛.传统的数据库在处理高维向量数据时往往面临性能瓶颈,而向量数据库的出现为这一问题提供了高效的解 ...

  2. Linux安装Libevent

    环境 Ubuntu 20.04.2 64位 软件包安装 通过apt-get 命令可以直接安装Libevent,这种方式方便快捷,省时省力. 安装命令如下: sudo apt-get install l ...

  3. NOIP 模拟赛(10.10):植物收集,美丽子区间,字符序列

    植物收集 题面: Dr. Wang是一位植物领域的专家.他要给他的学生们上一节课.课堂上需要展示一种植物.众所周知,植物的生长是有阶段的,本着严谨科学的态度,Dr. Wang 希望可以在课堂上给学生们 ...

  4. Python内置库itertools简单学习

    该库为满足特定需要的比较高效的迭代器内置库,在数据科学中的应用也不少,故有必要了解一下: import itertools import sys 无限迭代器(Infinite iterators) I ...

  5. Error while fetching metadata from server 'https://start.spring.io' Please check URL, network and proxy settings.

    idea创建springboot项目失败,提示: Error while fetching metadata from server 'https://start.spring.io' Please ...

  6. C# 定时器 Timer 如何精确到 1-2 毫秒以内

    最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题.这样就需要用到模拟触发1ms或者2ms触发事件.这让我第一时间想到了C#的定时器.由于我们项目用到的框架 ...

  7. gcc、g++命令

    gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步: 1.预处理,生成 .i 的文件[预处理器cpp] 2.将预处理后的文件转换 ...

  8. 记人生第一次DIY装机之旅

    一.调研 想装一台个人工作站很久了,原因是大学自用的笔记本总是在使用过程中过热关机,导致做一些CPU负载较高的工作时总是中断而无法连贯进行.考虑到目前手头还有一个Surface 3在使用,再买一个笔记 ...

  9. Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 解决办法

    Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 线程"main ...

  10. JDBC之查询

    案例1:查询所有用户的信息,封装到一个List里面 1 String url="jdbc:mysql://localhost:3306/nz201"; 2 String user= ...